10

如果用户希望中断执行,我需要另一个线程信号,但是我不确定如何实现信号/信号检查机制。我不想在我的项目中有一个单例(比如 global bool),但是有没有其他选择?

这个线程中,人们建议在 C++ 中使用适当的结构,但我不知道 .NET 中有任何类似的东西。有人可以解释一下吗?

4

6 回答 6

7

试试BackgroundWorker。它支持进度更新和取消正在运行的任务。

如果您希望一个线程等到另一个线程完成它的工作,那么 Monitor.Wait 和 Monitor.Pulse 都很好,ManualResetEvent 也是如此。但是,这些对于取消正在运行的任务并没有任何用处。

如果你想编写自己的取消代码,你可以在某个地方有一个两个线程都可以访问的字段。将其标记为 volatile,例如:

private volatile bool cancelling;

让主线程将其设置为 true,并让工作线程定期检查它并在完成后将其设置为 false。

这与拥有一个“全局变量”并没有真正的可比性,因为您仍然可以将信号量变量的范围限制为类私有。

于 2008-09-22T16:35:59.740 回答
5

有点模糊(时间短),但请查看ManualResetEvent 和 AutoResetEvent。您可能还想查找 Monitor 和 lock 关键字。

于 2008-09-22T16:33:39.043 回答
3

查看 Monitor.Wait 和 Monitor.Pulse。这是一篇关于 .Net 中的线程的优秀文章(非常易读):http ://www.albahari.com/threading/part4.aspx

于 2008-09-22T16:44:39.890 回答
1

一个简单的解决方案,如同步的静态布尔值,应该是您所需要的,而不是基于框架的解决方案,这对于您的场景来说是多余的。如果您仍然需要一个框架,请查看.NET 的并行扩展以获得想法。

于 2008-09-22T16:53:23.100 回答
1

这取决于您需要什么样的同步。如果您希望能够在循环中运行线程直到达到某种执行结束 - 您只需要一个静态 bool 变量。如果您希望一个线程等待另一个线程到达执行点,您可能需要使用 WaitEvents(AutoResetEvent 或 ManualResetEvent)。如果您需要等待多个 waitHandle,您可以使用 WaitHandle.WaitAll 或 WaitHandle.WaitAny。

于 2008-09-22T17:46:03.957 回答
-2

查看 System.Runtime.Remoting 命名空间。

于 2008-09-22T16:31:06.367 回答