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