如何找到ManualResetEvent处于什么状态?


72

我正在使用的实例ManualResetEvent来控制对资源的线程访问,但是我遇到了问题。有谁知道我在调试过程中如何找出对象的状态?

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


22
仅作记录,现在可以在.NET 4上使用ManualResetEventSlim它,除其他外,它提供了IsSet一种据说比.NET更快的方法WaitOne(0)
罗曼·斯塔科夫

Answers:


92

WaitOne对事件执行超时值为零的事件。

如果设置了事件,它将返回true;如果发生超时,则将返回false。换句话说,设置为true->事件,未设置false->事件。


2
那是个好主意,尽管调试器允许我检查其内部,但是我无法在其中找到状态?
乔治·莫尔

1
嗯...邓诺 我似乎记得它是一个不透明的对象,看起来没有太多帮助。但是,您可能可以在调试过程中在“即时窗口”中执行WaitOne调用:)
Andrew Rollings 08/12/23

您无法检查内部信息,因为此类是仅由句柄表示的OS构造的包装。
肯特郡

当WaitOne评估失败并显示“由于当前方法的代码已优化,因此无法评估表达式”时该怎么办。(chk build!)
David Burg

将返回值存储在变量中和/或使用System.Diagnostics.Debug.Write并在之后设置断点?
Andrew Rollings

6

这是工作代码:

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); } }

至少叫它IsBlocking。我看不到如何增强给定的答案,我想我们可以写下WaitOne(0)给定答案“WaitOne对超时值为零的事件执行a ”。
Maarten Bodewes,

1

您可以在“调试器监视”窗口中进行函数调用。mreVariable.WaitOne(0)在“监视”窗口中添加一个呼叫,以查看其评估结果。注意:请勿将其用于AutoResetEvents,因为这可能会更改实际状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.