BackgroundWorker多线程访问表单我正在使用5个BackgroundWorker对象同时运行用于特定目的,并且它们都必须更改相同的标签。我该怎么做如何从多个线程修改表单?如果我想更改公共字符串,我该怎么做?将Control.Invoke与委托一起使用。在你的后台工作线程中,而不是说label4.Text="Hello";说label4.Invoke(newAction(()=>{label4.Text="Hello";}));所有里面{}的东西都是在控件的线程上执行的,所以你避免了异常。这允许您从BackgroundWorker对UI进行任意更改,而不仅仅是报告进度。您可以在要更改标签的BackgroundWorker中使用ReportProgress方法,并在ProgressChanged事件处理程序中编写实际代码。您应该非常小心地调用同步Invoke而不是在gui上调用异步BeginInvoke。您很快就会有一个反应迟钝、草率的GUI,它似乎在尝试自我绘制,并且有可能出现死锁。这取决于您更新它的频率-您的后台线程真的需要等待gui返回吗?这听起来像是您的模型有问题。与Control.BeginInvoke一样,您可以查看SynchronizationContext。创建BackgroundWorker时,假设您是从UI线程创建它们,将SynchronizationContext.Current传递给工作线程。当BackgroundWorkers准备好在UI线程上调用某些东西时,它们会在创建它们时传入的SynchronizationContext实例上调用Synchronization.Post方法。这里和这里有两篇关于SynchronizationContext的好文章。看看这个答案。如果您有一个、五个或一千个工作线程,(概念上)并不重要。以上就是C#学习教程:BackgroundWorker多线程访问表单分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
