如何查找ManualResetEvent处于哪个状态?

80

我正在使用一个 ManualResetEvent 实例来控制线程访问资源,但我遇到了一些问题。有没有人知道在调试期间如何查找对象的状态?

也就是说,我想知道 ManualResetEvent 是否当前阻止任何线程,甚至可能知道它阻止了多少个线程以及哪些线程被阻止了。


25
仅供记录,.NET 4现在可以使用ManualResetEventSlim,其中包括提供了一个被认为比WaitOne(0)更快的IsSet方法。 - Roman Starkov
3个回答

103

使用零超时值对事件执行WaitOne操作。

如果事件被设置,它将返回true,如果超时,则返回false。 换句话说,true -> 事件已设置,false -> 事件未设置。


2
这是个好主意,调试器可以让我检查它的内部状态,但我不能在那里找到状态吗? - George Mauer
1
嗯...不知道。我记得它是一个不透明的对象,看起来并没有什么帮助。 但是,在调试期间,您可以在即时窗口中执行WaitOne调用 :) - Andrew Rollings
1
你无法检查内部结构,因为这个类是一个包装器,它围绕着一个仅由句柄表示的操作系统构造。 - Kent
当WaitOne评估失败并显示“无法评估表达式,因为当前方法的代码已经被优化”(在chk构建中!)时该怎么办? - David Burg
将返回值存储在变量中和/或使用System.Diagnostics.Debug.Write,并在断点之后设置断点? - Andrew Rollings

8

以下是可工作的代码:

private ManualResetEvent pause = new ManualResetEvent(false);
pause.WaitOne(); // caller thread pauses
pause.Set();    // another thread releases paused thread

// Check pause state
public bool IsPaused { get { return !pause.WaitOne(0); } }

1
至少将其命名为“IsBlocking”。我不明白这如何增强给定的答案,我猜我们可以直接写下“对具有零超时值的事件执行WaitOne()”来回答。 - Maarten Bodewes

1
您可以在调试器观察窗口中进行函数调用。 在 Watch 窗口中添加对 mreVariable.WaitOne(0) 的调用并查看其评估结果。 注意:不应将此用于 AutoResetEvents,因为这可能会更改实际状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接