【问题标题】:Updating a form control when a process ends进程结束时更新表单控件
【发布时间】:2015-03-05 11:33:00
【问题描述】:

我希望在用户单击表单上的按钮时并行启动多个进程,并在每个进程完成时更新同一表单上的列表框。

Process.Exited 事件似乎是我这里的朋友(记得设置EnableRaisingEvents 属性)。我以为我必须使用委托和Control.Invoke 来更新控件,但后来我注意到了Process.SyncronizingObject 属性。

他们的示例实际上并未显示触发事件时正在修改的表单/控件,因此我想确保我理解正确。

如果我将Process.SyncronizingObject 设置为我的Form,这是否意味着我的Process.Exited 事件处理方法可以直接修改表单以及任何子控件?

因此,通过这种方式,我可以在一个简单的 for 循环中运行一堆进程,这些进程将并行运行,并在每个进程完成时更新我的​​ GUI,而无需任何委托,锁定等?

【问题讨论】:

  • 似乎非常容易测试自己。
  • 并非如此。我如何从快速测试中知道它是正确的,并且不会导致罕见的难以跟踪的线程错误?很多不好的方法都可以在快速测试中起作用!

标签: c# .net winforms c#-4.0 asynchronous


【解决方案1】:

我不知道可以说清楚多少: from msdn

当 Exited 事件由可视 Windows 窗体组件处理时, 比如一个Button,通过系统线程访问组件 pool 可能不起作用,或者可能导致异常。避免这种情况 将 SynchronizingObject 设置为 Windows 窗体组件,这会导致 处理退出事件的方法将在同一线程上调用 在其上创建组件

【讨论】:

  • 严格来说,我不知道“退出事件由可视化 Windows 窗体组件处理”是什么意思。 Button 无法处理 Process.Exited。我认为它们的意思是“当组件被退出事件更改时......”但因此需要澄清。何时将SynchronizingObject 设置为Form,何时设置特定控件?
  • 你是对的。他们的措辞可能更准确一些。就个人而言,我永远不会将 SynchronizationObject 设置为表单以外的任何内容。但是,如果出于某些绝对平行维度的疯狂原因,您在不是 UI 线程的线程上创建了一个控件,并且该控件需要从 Exited 事件中更新,然后设置该控件作为同步对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多