使线程在.NET中发出另一个线程信号的最佳方法是什么?
-
02-07-2019 - |
题
如果用户希望中断执行,我需要另一个线程信号,但是我不确定如何实现信令/信号检查机制。我不想在我的项目中有一个单例(如全局 bool
),但还有其他选择吗?
在此主题中人们在C ++中建议适当的结构,但我不知道.NET中有类似的东西。有人可以解释一下吗?
解决方案
试用 BackgroundWorker 。它支持进度更新和正在运行的任务的取消。
如果你想让一个线程等到另一个线程完成它的事情,那么Monitor.Wait和Monitor.Pulse都是好的,就像ManualResetEvent一样。但是,这些对于取消正在运行的任务并没有任何用处。
如果你想编写自己的取消代码,你可以在两个线程都可以访问的地方找到一个字段。将其标记为易失性,例如:
private volatile bool cancelling;
让主线程将其设置为true,并让工作线程定期检查它并在完成后将其设置为false。
这与具有“全局变量”并不具有可比性,因为您仍然可以将信号量变量的范围限制为对某个类是私有的。
其他提示
有点模糊(缺少时间),但请查看 ManualResetEvent和AutoResetEvent 。您也可能想要查找Monitor并锁定关键字。
查看Monitor.Wait和Monitor.Pulse。这是一篇关于.Net中线程的优秀文章(非常易读): http://www.albahari的.com /线程/ part4.aspx
一个简单的解决方案,比如同步的静态布尔值,应该是您所需要的,而不是基于框架的解决方案,因为您的方案可能会过度杀戮。如果你还想要一个框架,请查看 parallel想法的扩展。
这取决于您需要什么样的同步。 如果您希望能够在循环中运行线程,直到达到某种执行结束 - 您只需要一个静态bool变量。 如果您希望一个线程等到另一个线程到达执行点,您可能需要使用WaitEvents(AutoResetEvent或ManualResetEvent)。 如果你需要等待多个waitHandles,你可以使用WaitHandle.WaitAll或WaitHandle.WaitAny。
查看System.Runtime.Remoting命名空间。