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 gibtWaitOneIst 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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage