我已经阅读了与此问题相关的几个问题/答案,但是找不到适用于该问题的解决方案。

我上面有一个表单(MainForm)和一个按钮(Upload)。当我单击按钮时(从ComboBox选择要上传到服务器的文件之后),它会打开另一个表单(UploadBackupForm)并将文件上传到服务器。上传过程由UploadBackupForm控制,形式如下:

c# - 标签上的“Invoke or BeginInvoke cannot be called on a control until”-LMLPHP

只要完成一次上传,此方法就起作用,我的意思是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一样,使timercount为非静态,因此它们专用于表单的每个实例。

关于c# - 标签上的“Invoke or BeginInvoke cannot be called on a control until”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49606928/

10-09 15:33