Frage

Ich versuche, einen Mutex zu verwenden, um den Zugriff auf einige Hardware vor mehreren Threads zu schützen, aber ich bin verwirrt darüber, was die exitContext Parameter bedeutet / tut:

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

Die Dokumente sagen:

exitcontext - Stimmt Um die Synchronisationsdomäne für den Kontext vor dem Warten (wenn in einem synchronisierten Kontext) zu verlassen, und sie anschließend wieder erfassen; Andernfalls, FALSCH.

... aber was bedeutet das eigentlich und was sind die Konsequenzen, wenn man es entweder wahr oder falsch festgelegt hat? Ich habe es vorerst auf wahr gesetzt und der Code scheint zu funktionieren, aber ich bin nervös, dass ich nicht vollständig verstehe, was es unter der Motorhaube vorhat!

War es hilfreich?

Lösung

Es erklärt auch weiter unten auf der Seite unter Anmerkungen das:

Anmerkungen zum Ausgang des Kontextes

Der ExitContext -Parameter hat keinen Effekt, es sei denn, die Waitone -Methode wird in einem nicht default verwalteten Kontext aufgerufen. Dies kann passieren, wenn sich Ihr Thread in einem Aufruf einer Instanz einer Klasse aus contextboundObject befindet. Selbst wenn Sie derzeit eine Methode in einer Klasse ausführen, die nicht von contextBoundObject abgeleitet ist, wie String, können Sie sich in einem nicht definierten Kontext befinden, wenn sich ein KontextgeboundObject in der aktuellen Anwendungsdomäne auf Ihrem Stapel befindet.

Wenn Ihr Code in einem nicht defauten Kontext ausführt, beantragt das Angeben von TRUE für ExitContext, dass der Thread den nicht default verwalteten Kontext (dh zum Übergang zum Standardkontext) beendet, bevor die Waitone -Methode ausgeführt wird. Der Thread kehrt nach Abschluss des Aufrufs zur Waitone -Methode zum ursprünglichen Nichtdefault -Kontext zurück.

Dies kann nützlich sein, wenn die kontextgebundene Klasse SynchronisationAttribute hat. In diesem Fall werden alle Aufrufe bei Mitgliedern der Klasse automatisch synchronisiert, und die Synchronisationsdomäne ist der gesamte Codekörper für die Klasse. Wenn der Code im Anrufstack eines Mitglieds die Waitone -Methode aufruft und TRUE für ExitContext angibt, verlässt der Thread die Synchronisationsdomäne, sodass ein Thread, der bei einem Aufruf an ein Mitglied des Objekts blockiert ist, fordert. Wenn die WaitOne -Methode zurückgibt, muss der Thread, der den Anruf getätigt hat, warten, um die Synchronisationsdomäne wieder einzugeben.

Andere Tipps

Der Bemerkung -Abschnitt der MSDN -Seite liest sich natürlich wie Uttor Gobbledegook. Ausführungskontexte sind ein gut verborgenes Implementierungsdetail in .NET. Ich werde Ihnen nur sagen, was ich umgekehrt habe, ohne es vollständig festzunehmen.

Das exitcontext Argument ist nur für Remoting -Szenarien relevant. Durch bestehen Stimmt, Sie lassen den aktuellen Anruf suspendiert und ein weiterer Anruf vom Client zum Server gesetzt. Sie würden dies tun, um den Durchsatz zu verbessern und true nur zu wählen, wenn Sie erwarten, dass der Waitone () -Anruf eine Weile dauert. Die genauen Auswirkungen darauf sind mir jedoch nicht offensichtlich oder dokumentiert, wo ich weiß. Die Überlastung von Waitone () (keine Auszeit) ist immer vorbei FALSCH, Das belastet meine Erklärung leider.

Eine Seitengeschichte hinter dieser Methode ist, dass Microsoft so schlecht bekannt ist, dass Microsoft beschlossen hat, die Kompatibilität in .NET 2 rückwärts zu brechen exitcontext Streit. Dies führte zu viel Chaos. Die Programmierer begannen, es zu verwenden, um ihr Programm zu fehlern, wenn sie auf einer Pre-SP2-Version von .NET ausgeführt wurden. Autsch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top