我已经阅读了与此问题相关的几个问题/答案,但是找不到适用于该问题的解决方案。
我上面有一个表单(MainForm
)和一个按钮(Upload
)。当我单击按钮时(从ComboBox选择要上传到服务器的文件之后),它会打开另一个表单(UploadBackupForm
)并将文件上传到服务器。上传过程由UploadBackupForm
控制,形式如下:
只要完成一次上传,此方法就起作用,我的意思是UploadBackupForm
被调用一次。第二次单击“上传”按钮时,UploadBackupForm
打开,并且(在上传一些数据之后)它引发错误,提示:
在此特定行:
DurationLabel.Invoke((MethodInvoker)delegate
{
DurationLabel.Text = Count2Duration(count);
});
这让我感到困惑,因为它一次完成就可以工作,而第二次就不起作用。我具有C#的基本知识,所以我不知道是什么原因导致的以及如何解决。
MainForm
:private void Upload2ServerButton_OnClick(object sender, EventArgs e)
{
Form UBF = new UploadBackupForm();
UBF.ShowDialog();
}
UploadBackupForm
:public partial class UploadBackupForm : Form
{
public UploadBackupForm()
{
InitializeComponent();
}
public static System.Timers.Timer timer = new System.Timers.Timer();
public static int count = 0;
private void UploadBackup_Load(object sender, EventArgs e)
{
timer.Interval = 1000;
timer.Elapsed += new ElapsedEventHandler(delegate {
count++;
// didn't do any good (this.IsHandleCreated or DurationLabel.IsHandleCreated)
// if (!this.IsHandleCreated)
// {
// this.CreateControl();
// }
DurationLabel.Invoke((MethodInvoker)delegate
{
DurationLabel.Text = Count2Duration(count);
});
});
// upload the archive to the server
new Thread((ThreadStart)delegate
{
FTP.Item[] items = FTP.ListDirectoryDetails(DataIO.FTP.Server, DataIO.FTP.Username, DataIO.FTP.Password, DataIO.FTP.UploadDir);
// here, I upload the file to the server and update the progress bar and the uploaded / total labels
最佳答案
因为timer
变量是静态的,所以即使在关闭窗体后它仍然保留。它包含对委托(delegate)的引用,该委托(delegate)包含对表单的引用,因此在应用程序的生命周期中,以前的实例将保持 Activity 状态。同样,单个timer
将回调与当前实例一起发布到所有先前的实例。
正如in the comments正确指出的Evk一样,使timer
和count
为非静态,因此它们专用于表单的每个实例。
关于c# - 标签上的“Invoke or BeginInvoke cannot be called on a control until”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49606928/