Ich möchte eine Sperre oder eine ähnliche Synchronisierung verwenden, um einen kritischen Abschnitt zu schützen. Gleichzeitig möchte ich ein CancellationToken hören.
Im Moment benutze ich einen Mutex wie diesen, aber Mutex hat keine so gute Leistung. Kann ich anstelle des Mutex auch andere Synchronisationsklassen (einschließlich des neuen .Net 4.0) verwenden?
%Vor% Sehen Sie sich die neue .NET 4.0 Framework
-Funktion SemaphoreSlim-Klasse an. Es bietet SemaphoreSlim.Wait (CancellationToken) -Methode.
Blockiert den aktuellen Thread, bis er in den SemaphoreSlim eintreten kann, während ein CancellationToken beobachten
Aus irgendeinem Grund könnte die Verwendung von Semaphore in solch einem einfachen Fall ein Overhead sein, da es ursprünglich entworfen wurde, um einen Zugriff für mehrere Threads zu ermöglichen, aber vielleicht finden Sie es vielleicht nützlich.
BEARBEITEN: Das Code-Snippet
%Vor% Wenn Cancel()
auf einem Token aufgerufen wird, wird ThrowIfCancellationRequested()
aufgerufen, da dies mit dem Register
-Rückruf verbunden ist. Sie können die gewünschte Stornierungslogik hier eingeben. Dieser Ansatz ist großartig, weil Sie blockierende Aufrufe abbrechen können, indem Sie die Bedingungen erzwingen, die den Abschluss des Aufrufs bewirken.
ThrowIfCancellationRequested löst eine OperationCanceledException aus. Sie müssen dies auf dem aufrufenden Thread behandeln oder Ihr gesamter Prozess könnte heruntergefahren werden. Ein einfacher Weg, dies zu tun, besteht darin, Ihre Aufgabe mit der Task-Klasse zu starten, die alle Ausnahmen sammelt, die Sie für den aufrufenden Thread behandeln müssen.
%Vor%Einige gute Sachen hier , die eine kooperative Absage abdecken
Sie könnten Monitor
object verwenden, um ein bisschen Leistung zu erzielen, wie es auch in MSDN angegeben ist:
Obwohl ein Mutex für die Thread-Synchronisierung innerhalb eines Prozesses verwendet werden kann, wird die Verwendung von Monitor im Allgemeinen bevorzugt, da Monitore speziell für .NET Framework entwickelt wurden und daher Ressourcen besser nutzen
Für weitere Informationen
Das CancellationToken
bietet Ihnen ein Modell für kooperatives Löschen von asynchronen oder lang laufenden synchronen Operationen.
Wenn Sie es mit der Monitorklasse verwenden möchten, müssen Sie den Code so strukturieren, dass die Sperre aufgehoben wird, wenn es sich um eine Löschanforderung handelt. Sie könnten etwas tun, das unten:
oder wenn Sie ThrowIfCancellationRequested verwenden möchten:
%Vor%Tags und Links c# multithreading task-parallel-library .net-4.0 cancellation-token