.NET 手动重置事件

本文关键字:事件 NET | 更新日期: 2023-09-27 18:37:12

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

.NET 手动重置事件

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

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

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

是的,代码还在继续。