Effiziente nicht blockierende Methoden in C# erstellen
Die Entwicklung wirklich nicht blockierender Methoden in C# erfordert sorgfältige Überlegungen, insbesondere wenn es um Geschwindigkeit und Effizienz geht. Es gibt zwar Optionen wie WCFs [OperationContract(IsOneWay = true)]
, doch ihr Aufwand überwiegt häufig die Vorteile. In diesem Artikel werden einfachere und effizientere Alternativen untersucht.
Das ideale Szenario ist ein einfaches, leicht verfügbares static void NonBlockingMethodFoo()
, das jedoch nicht direkt unterstützt wird. Stattdessen können wir mit zwei Hauptansätzen ein ähnliches nicht blockierendes Verhalten erreichen:
1. Nutzung ThreadPool.QueueUserWorkItem
:
Diese Methode bietet eine einfache Möglichkeit, Arbeit in einen Thread-Pool-Thread auszulagern. Es akzeptiert einen Delegaten und ermöglicht so die Kapselung Ihrer nicht blockierenden Logik.
2. Verwendung von Task.Run
:
Ein modernerer Ansatz: Task.Run
erstellt eine Aufgabe in einem Thread-Pool-Thread und führt sie aus. Seine Lambda-Ausdruckssyntax vereinfacht den Prozess der Definition der nicht blockierenden Operation.
Praxisbeispiele:
Erwägen Sie eine FireAway
Methode, die eine Verzögerung von 5 Sekunden simuliert, bevor eine Nachricht an die Konsole ausgegeben wird. Im Folgenden wird die nicht blockierende Ausführung mit beiden Methoden veranschaulicht:
<code class="language-csharp">// Using ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem(o => FireAway()); // Using Task.Run Task.Run(() => FireAway());</code>
Wichtige Überlegungen:
Obwohl diese Techniken nicht blockierende Anrufe erzeugen, denken Sie daran, dass sie keine sofortige Fertigstellung garantieren. Wenn das Ergebnis der Methode entscheidend ist, benötigen Sie Mechanismen, um mögliche Unterbrechungen zu bewältigen oder sicherzustellen, dass die Aufgabe erfolgreich abgeschlossen wird. In Umgebungen wie ASP.NET sind möglicherweise zusätzliche Strategien erforderlich, um die Thread-Aktivität aufrechtzuerhalten, bis die Aufgabe abgeschlossen ist. Die Wahl zwischen ThreadPool.QueueUserWorkItem
und Task.Run
hängt oft von der Präferenz und dem Projektkontext ab, wobei Task.Run
im Allgemeinen wegen seiner saubereren Syntax und besseren Integration in das asynchrone Programmiermodell des .NET Frameworks bevorzugt wird.
Das obige ist der detaillierte Inhalt vonWie erreicht man effizient nicht blockierende Methodenaufrufe in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!