Wie entblocke ich threads, die nannten Sie die WaitOne-Methode auf ein AutoResetEvent-Objekt?

Unten ist eine Klasse mit der Methode 'SomeMethod', das veranschaulicht mein problem.

class SomeClass
{
    AutoResetEvent theEvent = new AutoResetEvent(false);
    //more member declarations

    public void SomeMethod()
    {
        //some code
        theEvent.WaitOne();
        //more code
    }
}

Ist die Methode entwickelt werden, um thread-sicher und wird aufgerufen, in verschiedenen threads. Nun ist meine Frage, wie ist es möglich zu entsperren alle threads, die sogenannten "WaitOne-Methode" auf die "theEvent" Objekt an jedem Punkt der Zeit? Diese Anforderung besteht Häufig bei mein design, weil ich in der Lage sein müssen, um ordnungsgemäß starten und stoppen meine multi-threaded Programm. Es scheint mir, dass es ist ziemlich einfach zu beginnen, ein multi-threaded Programm, aber schwer zu stoppen.

Hier ist, was ich bisher versucht habe, die anscheinend funktioniert. Aber ist das die standard-Vorgehensweise?

public void UnblockAll()
{
    do
    {
        theEvent.Set();
    } while (theEvent.WaitOne(0));
}

'UnblockAll' - Methode ist ein Mitglied der 'SomeClass' Klasse. Die hier verwendete Technik beruht auf der MSDN-Dokumentation der WaitOne-Methode. Ich zitiere den entsprechenden Teil der Dokumentation unter:

Wenn millisecondsTimeout null ist, wird die Methode nicht blockiert. Er prüft den Zustand der wait-handle und liefert sofort eine Rückgabe.

In der do..while-Schleife rufe ich die Set-Methode. Dies löst einen einzelnen thread, der möglicherweise blockiert haben, durch einen Aufruf an die WaitOne-Methode (codiert innerhalb der 'SomeMethod' - Methode). Als Nächstes Teste ich den Zustand der "theEvent" Objekt nur wissen ob es signalisiert. Diese Untersuchung erfolgt durch den Aufruf der überladenen version der WaitOne-Methode mit einem Timeout-parameter. Das argument, das ich benutze, wenn ich rufen Sie die WaitOne-Methode ist null, die gemäß der Dokumentation der Ergebnisse in den rufen der Rückkehr sofort mit einem booleschen Wert. Wenn der Rückgabewert true ist, dann wird der "theEvent" Objekt war in einem signalisierten Zustand. Wenn es wenigstens einen einzigen thread blockiert der Aufruf der 'WaitOne-Methode" in der 'SomeMethod' - Methode, die den Aufruf der 'Set' - Methode (codiert in den UnblockAll' - Methode), würde die Sperre. Daher der Aufruf an die 'WaitOne-Methode am Ende der do..while-Anweisung in der 'UnblockAll' Methode false zurück. Der Rückgabewert ist wahr, nur wenn es keine threads blockiert.

Ist die obige Argumentation Recht, und wenn es stimmt, ist die Technik, die ein standard-Weg, um mit meinem problem? Ich bin versucht, die Lösung in Erster Linie auf der .net compact-framework 2.0-Plattform.

Off topic - man kann Sie nicht rufen Sie die variable "Veranstaltung"
Klingt wie Sie wollen ein ManualResetEvent, statt. Auf diese Weise wird es bleiben gesetzt, auch wenn Sie mehrere Zuhörer.
korrigiert die syntax-Fehler im code..

InformationsquelleAutor ghd | 2011-05-09

Schreibe einen Kommentar