【发布时间】:2016-04-13 07:11:05
【问题描述】:
我正在尝试从 BackgroundWorker 线程更新标签,该线程从 Form 之外的另一个类调用方法。所以我基本上想这样做:
MainForm.counterLabel.Text = Counter.ToString();
但标签是私有的。我已经研究过使用 BackgroundWorker 的 progressupdate 函数、调用等,但它们似乎不是我需要的。
这是我的更多代码:
主窗体:
clickThread.DoWork += (s, o) => { theClicker.Execute(speed); };
clickThread.RunWorkerAsync();
调用的类/方法:
public void Execute(int speed)
{
while (running)
{
Thread.Sleep(speed);
Mouse.DoMouseClick();
Counter++;
//Update UI here
}
}
我认为我的代码有点过于复杂了:\ 并让自己陷入了困境。
【问题讨论】:
-
如果标签是私有的,你会暴露一个方法或属性来设置它吗?
-
所以要理解问题:对象“theClicker”无法访问MainForm的私有标签,对吗?解决此问题的一个非常糟糕的方法是将标签传递给“theClicker”的 Execute 方法。
-
BW 的基础很简单——不要从
DoWork内部访问 UI。在DoWork中做非 UI 的东西,在ProgressChanged中做 UI 的东西。 -
之前的cmet一般。如果您的点击器的唯一“工作”是定期执行鼠标点击(UI 操作),那么 BW 根本不合适 - 简单的
Windows.Forms.Timer就足够了。 -
如果你不想使用 ProgressChanged,那么使用 BGW 是没有意义的。您可以只使用原始线程并在控件上调用 BeginInvoke。当然,远更好的解决方案是使用 .NET 的 async/await 支持,这样您就可以运行异步任务以及从相同的方法更新 UI。
标签: c# multithreading winforms user-interface backgroundworker