.NET手动重置事件

5
在下面的代码中,主函数等待手动重置事件(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)结束之前执行了,所以你处于信号状态。 - Sudhakar B
有了你的代码,当 WaitOne 代码行被执行时,重置事件显然会被设置。由于手动重置事件是设计成像你在这里使用的那样,它怎么可能是“不安全”的呢? - GameAlchemist
我多年前也有同样的问题。赞扬你对重置事件进行调试。它们在处理线程时非常方便。 - jglouie
2个回答

6
是的。如果已经发出信号,就不会有任何等待。这很好。
实际上,如果你查看WaitOne(int)的返回值,你会发现它会在已经设置(或在超时之前设置)时返回true,如果在你的超时值内没有设置,则返回false
这种区别有时很重要,所以请注意它有一个返回值。

0
是的,没错,代码就这样继续执行下去。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接