【问题标题】:How to find what state ManualResetEvent is in?如何找到 ManualResetEvent 的状态?
【发布时间】:2008-12-23 15:43:03
【问题描述】:

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

也就是说我想知道ManualResetEvent当前是否阻塞了任何线程,甚至可能阻塞了多少线程。

【问题讨论】:

  • 仅作记录,在 .NET 4 上,现在可以使用 ManualResetEventSlim,除其他外,它提供了一种 IsSet 方法,它比 said to be 快于 WaitOne(0)。跨度>

标签: .net multithreading locking


【解决方案1】:

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

如果设置了事件,它将返回 true,如果发生超时,则返回 false。 也就是说,true -> 事件设置,false -> 事件未设置。

【讨论】:

  • 这是个好主意,调试器允许我检查它的内部,但我不能在那里的某个地方找到状态吗?
  • 嗯...不知道。我似乎记得它是一个不透明的物体,看起来没有多大帮助。但是,您可能可以在调试期间在即时窗口中执行 WaitOne 调用 :)
  • 您无法检查内部结构,因为此类是仅由句柄表示的 OS 构造的包装器。
  • WaitOne 评估失败并显示“无法评估表达式,因为当前方法的代码已优化”时该怎么办。 (在 chk 构建中!)
  • 将返回值存储在变量中和/或使用 System.Diagnostics.Debug.Write 并在之后设置断点?
【解决方案2】:

这是工作代码:

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。”
【解决方案3】:

您可以在 Debugger Watch 窗口中进行函数调用。 在 Watch 窗口中添加对 mreVariable.WaitOne(0) 的调用,然后查看它的计算结果。 注意:您不应该将它用于 AutoResetEvents,因为这可能会改变实际状态。

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-03-24
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多