.NET手动重置事件

时间:2012-06-13 10:44:29

标签: c# .net multithreading

在下面的代码中,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");
    }
}

2 个答案:

答案 0 :(得分:6)

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

事实上,如果你查看WaitOne(int)的返回值,如果它已经设置(或者在超时之前设置),你会看到它返回true,{{1}如果它没有在你的超时值内设置。

这种区别有时很重要,所以要注意有一个返回值。

答案 1 :(得分:0)

是的,代码就在继续。