これに対する答えを知っておくべきだと思いますが、壊滅的な間違いを犯している可能性がある場合に備えて、とにかく尋ねます.
次のコードは、エラー/例外なしで期待どおりに実行されます。
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");
}
もちろん、マルチスレッド コードではよくあることですが、テストが成功しても、これが実際にスレッド セーフであるとは証明されません。ドキュメントには、 a の後に何かをしようとすると未定義の動作が発生すると明確に記載されていますが、Close
前に を置いた場合もテストは成功します。Set
Close
私の質問は、メソッドを呼び出すときに、呼び出し元に制御を返す前に、待機中のすべてのManualResetEvent.Set
スレッドに通知することが保証されているかということです。言い換えると、 への呼び出しがこれ以上ないことを保証できると仮定すると、ここでハンドルを閉じても安全ですか? または、状況によっては、このコードによって一部のウェイターがシグナルを受け取るのを妨げたり、?_WaitOne
ObjectDisposedException
ドキュメントSet
には、「シグナル状態」になると書かれているだけです。ウェイターが実際にいつそのシグナルを受け取るかについては何も主張していないようです。