当前位置: 首页 > 编程语言 > C#

我应该使用Invoke还是SynchronizationContext从另一个线程更新表单控件?Share

时间:2023-04-10 11:45:12 C#

我应该使用Invoke还是SynchronizationContext从另一个线程更新表单控件?尝试从其他线程更新UI控件。目前正在使用BeginInvoke,老实说它工作正常,但我一直听到你如何使用SynchronizationContext来做同样的事情。哪个更受欢迎?另外,从线程更新UI是不好的做法吗?引发一个事件并让主窗体处理它会更好还是有其他更好的方法来做到这一点?抱歉有点主观的问题,但在线程空间中有很多选项,我正在尝试了解它们的不同之处和每个选项的适用范围,以及为将来编写可读和可扩展代码的最佳实践。编辑:现在我还看到还有TaskScheduler.FromCurrentSynchronizationContext路由。这么多选项x_x我更喜欢SynchronizationContext而不是Control.Invoke。Control.Invoke的危险在于拥有Control存在生命周期问题。如果您在尝试调用它时释放该控件,它会影响调用成功的能力。当对话框关闭、视图移动等时会发生这种情况......SynchronizationContext.Current通常与它关联的线程一样长。它确实有一个有限的生命周期,所以最终会遇到同样的问题,但它比Control更容易预测。您是否考虑过使用BackgroundWorker组件?这是为不应占用UI的长时间运行的任务获取多线程功能的巧妙方法。例如,您可以使用ProgressChanged事件来执行对UI的更新,后台工作者和后台工作者类将确保创建BW的线程是执行ProcessChanged和WorkComplete事件的线程。因此,如果您从UI创建BW并将其设置为工作,那么您可以从那里安全地更新UI。这是来自MS的一篇快速文章http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx另一个非常好的链接http://www.albahari.com/threading/part3.aspx#_BackgroundWorker以上是C#学习教程:更新另一个线程的表单控件应该用Invoke还是SynchronizationContext?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: