我觉得我应该知道这个问题的答案,但无论如何我都会问,以防万一我犯了一个潜在的灾难性错误。
以下代码按预期执行,没有错误/异常:
static void Main(string[] args)
{
ManualResetEvent flag = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(s =>
{
flag.WaitOne();
Console.WriteLine("Work Item 1 Executed");
});
ThreadPool.QueueUserWorkItem(s =>
{
flag.WaitOne();
Console.WriteLine("Work Item 2 Executed");
});
Thread.Sleep(1000);
flag.Set();
flag.Close();
Console.WriteLine("Finished");
}
当然,与多线程代码的情况一样,成功的测试并不能证明这实际上是线程安全的。如果我放Close
before Set
,测试也会成功,即使文档明确指出尝试在 a 之后执行任何操作Close
都会导致未定义的行为。
我的问题是,当我调用该ManualResetEvent.Set
方法时,是否保证在将控制权返回给调用者之前向所有等待线程发出信号?换句话说,假设我能够保证不会再调用,在这里关闭句柄是否安全,或者在某些情况下,此代码可能会阻止某些服务员收到信号或导致一个?WaitOne
ObjectDisposedException
该文档仅说Set
将其置于“信号状态”-它似乎没有声明服务员何时真正收到该信号,所以我想确定一下。