Es gibt eine Task-Variable und lässt sagen, dass die Task gerade läuft .. indem Sie die folgende Zeile ausführen.
%Vor%Ich habe mich gefragt, was passiert, wenn ich diesen Code schreibe:
%Vor%Würde es die Aufgabe zweimal ausführen? Oder eine Ausnahme auslösen, weil sie bereits ausgeführt wurde?
Würde es die Aufgabe zweimal ausführen? Oder eine Exception werfen, weil sie es hat schon laufen?
Nein und nein. Das einzige, was await
tut, ist Task.GetAwaiter
aufzurufen, es wird nichts ausgeführt. Wenn die Aufgabe bereits abgeschlossen wurde, wird entweder der Wert extrahiert, wenn es sich um Task<T>
handelt, oder synchron zur nächsten Zeile ausgeführt, wenn es sich um eine Task
handelt, da bereits abgeschlossene Aufgaben optimiert wurden.
Eine einfache Demo:
%Vor%Wenn Sie einen Drilldown auf die Statusmaschine selbst durchführen, sehen Sie Folgendes:
%Vor% Diese Optimierung prüft zuerst den Abschluss der Aufgabe. Wenn die Aufgabe nicht abgeschlossen ist, ruft sie UnsafeOnCompleted
auf, wodurch die Fortsetzung registriert wird. Wenn es abgeschlossen ist, bricht es die switch
und geht zu:
Dies setzt das Ergebnis für das zugrunde liegende Task
, und auf diese Weise erhalten Sie den Wert synchron.
Ich habe diesen schnellen Test zusammengestellt:
%Vor%Es schreibt:
%Vor%Also, klar, die Aufgabe läuft nur einmal.
Tags und Links .net c# task-parallel-library asynchronous parallel-processing