【发布时间】:2008-09-22 16:29:54
【问题描述】:
如果用户希望中断执行,我需要另一个线程发出信号,但是我不确定如何实现信号/信号检查机制。我不想在我的项目中使用单例(比如全局 bool),但有替代方案吗?
在this thread 中,人们建议在 C++ 中使用适当的结构,但我不知道 .NET 中是否有类似的东西。有人可以解释一下吗?
【问题讨论】:
标签: .net multithreading signals
如果用户希望中断执行,我需要另一个线程发出信号,但是我不确定如何实现信号/信号检查机制。我不想在我的项目中使用单例(比如全局 bool),但有替代方案吗?
在this thread 中,人们建议在 C++ 中使用适当的结构,但我不知道 .NET 中是否有类似的东西。有人可以解释一下吗?
【问题讨论】:
标签: .net multithreading signals
试试BackgroundWorker。它支持进度更新和取消正在运行的任务。
如果您希望一个线程等待另一个线程完成它的工作,那么 Monitor.Wait 和 Monitor.Pulse 是不错的选择,ManualResetEvent 也是如此。但是,这些对于取消正在运行的任务实际上并没有任何用处。
如果你想编写自己的取消代码,你可以在某个地方有一个两个线程都可以访问的字段。将其标记为 volatile,例如:
private volatile bool cancelling;
让主线程将其设置为 true,并让工作线程定期检查并在完成后将其设置为 false。
这与拥有一个“全局变量”并没有真正的可比性,因为您仍然可以将信号量变量的范围限制为类的私有。
【讨论】:
有点含糊(时间不够),但请查看ManualResetEvent and AutoResetEvent。您可能还想查找 Monitor 和 lock 关键字。
【讨论】:
查看 Monitor.Wait 和 Monitor.Pulse。这是一篇关于 .Net 中的线程的优秀文章(非常易读):http://www.albahari.com/threading/part4.aspx
【讨论】:
一个简单的解决方案,如同步的静态布尔值,应该是您所需要的,而不是一个基于框架的解决方案,这对于您的场景来说是多余的。如果您仍然需要一个框架,请查看parallel extensions to .NET 以获取想法。
【讨论】:
这取决于您需要什么样的同步。 如果您希望能够在循环中运行线程直到达到某种执行结束 - 您只需要一个静态 bool 变量。 如果您希望一个线程等待另一个线程到达执行点,您可能需要使用 WaitEvents(AutoResetEvent 或 ManualResetEvent)。 如果你需要等待多个 waitHandles,你可以使用 WaitHandle.WaitAll 或 WaitHandle.WaitAny。
【讨论】:
查看 System.Runtime.Remoting 命名空间。
【讨论】: