BackgroundWorkermultithreading访问表单

我正在使用同时运行的5个BackgroundWorker对象用于特定目的,并且所有这些对象都必须更改相同的标签。 我怎么做?

如何从多个线程修改表单呢? 如果我想更改公共字符串,我该怎么做呢?

将Control.Invoke与委托一起使用。

在你的后台工作者线程中,而不是说

label4.Text = "Hello"; 

 label4.Invoke(new Action(() => { label4.Text = "Hello"; } )); 

{}内的所有内容都在控件的线程上执行,因此您可以避免exception。

这允许您从BackgroundWorker对用户界面进行任意更改,而不仅仅是报告进度。

您可以在BackgroundWorker中使用ReportProgress方法,您希望更改标签并在ProgressChanged事件处理程序中编写实际代码。

您应该非常警惕调用同步Invoke而不是gui上的异步BeginInvoke。 你很快就会有一个反应迟钝的草率gui,似乎在努力为自己画画,以及陷入僵局的可能性。
这取决于你更新它的频率 – 你的后台线程真的需要等待gui返回吗? 这听起来像你的模型的问题。

与Control.BeginInvoke一样,您可以查看SynchronizationContext 。

在创建BackgroundWorkers时,假设您是从UI线程创建它们,则将SynchronizationContext.Current传递给worker。 当BackgroundWorkers准备好在UI线程上调用某些东西时,它们会在创建它们时传入的SynchronizationContext实例上调用Synchronization.Post方法。

在这里和这里有两篇关于SynchronizationContext的好文章。

看看这个答案 。 如果你有一个,五个或一千个工作线程(概念意义上)并不重要。