【问题标题】:.NET Manual Reset Event.NET 手动重置事件
【发布时间】:2012-06-13 10:44:29
【问题描述】:

在下面的代码中,Main 函数等待手动重置事件 (mre) 被设置。 但是,在等待开始之前,同步对象已经被其他线程设置为信号状态。

那么,等待“已经发出信号的同步对象”是否安全?

class Program
{
    static void Main(string[] args)
    {
        ManualResetEvent mre = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem(new WaitCallback(Func), mre);
        Thread.Sleep(1500);
        mre.WaitOne(100000); // Waiting for already signaled object
        Console.WriteLine("Wait Completed");
    }

    public static void Func(object state)
    {
        ManualResetEvent mre = (ManualResetEvent)state;
        mre.Set();
        Console.WriteLine("Mre Is Set");
    }
}

【问题讨论】:

  • 您期待什么?在上面的示例中,mre.Set() 在 Thread.Sleep(1500) 结束之前已经执行,因此您处于信号状态。
  • 使用您的代码,很明显当 WaitOne 代码行被命中时将设置重置事件。既然手动重置事件被设计成你在这里使用的方式,它怎么可能是“不安全的”??
  • 几年前我和你有同样的问题。感谢您修补重置事件。它们对于处理线程非常方便。

标签: c# .net multithreading


【解决方案1】:

是的。如果它已经发出信号,则不会有任何等待。没关系。

事实上,如果你查看WaitOne(int) 的返回值,你会发现如果它已经设置(或在超时之前设置)它返回true,如果它没有设置则返回false在您的超时值内设置。

这种区别有时很重要,因此请注意存在返回值。

【讨论】:

    【解决方案2】:

    是的,代码还在继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2014-06-11
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多