用于更新 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));
我正在尝试更新来自 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));