从多个工作线程更新UI(.NET)

ian*_*sme 6 .net c# user-interface multithreading

我有一个我正在研究的宠物项目,它有多个工作线程.将所有内容输出到控制台变得越来越难以遵循,因此我想开发一个每个线程有一个输出区域的UI.我想知道线程向UI发送更新的最佳方式.我有两个想法:

1)让每个线程在新数据可用时设置"DataUpdated"标志,并让UI定期检查新数据.

2)创建每个线程,并在新数据可用时调用UI Update(...)方法.

我目前倾向于(2)有两个原因:我不喜欢"检查"每个线程的想法,因为这是我的第一个多线程应用程序,(2)似乎比它可能更简单.我想知道:

  • 在简单性和效率方面哪个选项更可取?
  • 你有任何实施(2)或类似的东西(即更多事件驱动)的提示吗?

ito*_*son 12

您可以通过创建BackgroundWorker组件并在其DoWork处理程序中完成工作来轻松实现(2):

BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.DoWork += /* your background work here */;
bw.ProgressChanged += /* your UI update method here */;
bw.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)

每个BackgroundWorker都可以通过调用ReportProgress向UI线程报告进度:虽然这主要用于报告有界进程的进度,但这不是必需的 - 如果这是您的UI更新所需要的,您也可以传递自己的自定义数据.您可以从DoWork处理程序调用ReportProgress.

BackgroundWorker的优点在于它可以为您处理大量杂乱的交叉线程细节.它也符合事件驱动的更新模型,您(正确地)更喜欢显式回调.

  • 非常好,谢谢!现在我只需要等待离开我的日常工作,这样我就可以去做一些真正的编程. (2认同)