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