在下面的代码中,main函数等待设置手动重置事件(mre)。
但是,在等待开始之前,sync对象已经被其他线程设置为signaled状态。
那么,等待“已经发出信号的同步对象”是否安全?
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");
}
}
最佳答案
对。如果已经发出信号,就不会有任何等待。没关系。
事实上,如果您查看WaitOne(int)
的返回值,您将看到如果它已经设置(或在超时之前设置),则返回true
,如果它没有在您的超时值内设置,则返回false
。
这种区别有时很重要,所以要知道有一个返回值。