Was passiert, wenn ich auf eine Aufgabe warte, die bereits ausgeführt wird oder ausgeführt wird?

8

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?

    
Bilal Fazlani 07.09.2015, 08:43
quelle

2 Antworten

9
  

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:

%Vor%

Dies setzt das Ergebnis für das zugrunde liegende Task , und auf diese Weise erhalten Sie den Wert synchron.

    
Yuval Itzchakov 07.09.2015, 08:44
quelle
6

Ich habe diesen schnellen Test zusammengestellt:

%Vor%

Es schreibt:

%Vor%

Also, klar, die Aufgabe läuft nur einmal.

    
Enigmativity 07.09.2015 09:04
quelle