Ist es sicher, ein ManualResetEvent zu signalisieren und sofort zu schließen?
Ich habe das Gefühl, ich sollte die Antwort darauf wissen, aber ich werde trotzdem fragen, falls ich einen potenziell katastrophalen Fehler mache.
Der folgende Code wird wie erwartet ohne Fehler / Ausnahmen ausgeführt:
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");
}
Natürlich beweist ein erfolgreicher Test, wie es normalerweise bei Multithread-Code der Fall ist, nicht, dass dies tatsächlich threadsicher ist. Der Test ist auch erfolgreich, wenn ich es sageClose
VorSet
, obwohl in der Dokumentation eindeutig angegeben ist, dass nach aClose
führt zu undefiniertem Verhalten.
Meine Frage ist, wann ich das aufrufen sollManualResetEvent.Set
Methode ist es garantiert zu signalisierenalle wartende FädenVor Kontrolle an den Anrufer zurückgeben? Mit anderen Worten, vorausgesetzt, ich kann garantieren, dass es keine weiteren Anrufe mehr gibtWaitOne
Ist es sicher, den Griff hier zu schließen, oder ist es möglich, dass dieser Code unter bestimmten Umständen verhindert, dass einige Kellner signalisiert werden oder eineObjectDisposedException
?
Die Dokumentation sagt nur dasSet
versetzt es in einen "signalisierten Zustand" - es scheint keinen Anspruch darauf zu erheben, wann Kellner dies tun werdeneigentlich bekommen dieses Signal, also möchte ich sicher sein.