用于更新 WinForms 的 BackgroundWorker 线程 UI

BackgroundWorker thread to Update WinForms UI

我正在尝试更新来自 BackgroundWorker 线程的标签,该线程从表单外的另一个 class 调用方法。所以我基本上想这样做:

MainForm.counterLabel.Text = Counter.ToString();

但标签是私有的。我已经研究过使用 BackgroundWorker 的 progressupdate 函数、调用等,但它们似乎不是我需要的。

这是我的更多代码:

主窗体:

clickThread.DoWork += (s, o) => { theClicker.Execute(speed); };
clickThread.RunWorkerAsync();

Class/Method 叫:

public void Execute(int speed)
{
    while (running)
    {
       Thread.Sleep(speed);
       Mouse.DoMouseClick();
       Counter++;
       //Update UI here
    }
}

我觉得我的代码有点过于复杂了:\,把自己逼到了墙角。

您应该使用 ProgressChanged-Event 来更新 UI。 BackgroundWorker 的代码应该类似于:

internal static void RunWorker()
{
    int speed = 100;
    BackgroundWorker clickThread = new BackgroundWorker
    {
        WorkerReportsProgress = true
    };
    clickThread.DoWork += ClickThreadOnDoWork;
    clickThread.ProgressChanged += ClickThreadOnProgressChanged;
    clickThread.RunWorkerAsync(speed);

}

private static void ClickThreadOnProgressChanged(object sender, ProgressChangedEventArgs e)
{

    someLabel.Text = (string) e.UserState;

}

private static void ClickThreadOnDoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = (BackgroundWorker)sender;
    int speed = (int) e.Argument;

    while (!worker.CancellationPending)
    {
        Thread.Sleep(speed);
        Mouse.DoMouseClick();
        Counter++;
        worker.ReportProgress(0, "newText-Parameter");
    }
}

}

尝试调用该方法。

例如:-

this.Invoke((Action)(() => Resources.xobjMF.Enabled = true));