Warten auf eine leere Aufgabe dreht sich für immer (warten Sie auf neue Aufgabe (() = {}))

9

Ich versuche, diesen Code zu verstehen:

%Vor%

Die Methode Example endet niemals und blockiert für immer. Warum?

Die Korrektur (aus Stubbing-Aufgabe Methode im asynchronen Komponententest zurückzugeben ) soll await new Task( () => {}) durch return Task.FromResult<object>(null); ersetzen, aber nochmal, warum ist das nötig?

Ich weiß, dass es eine Menge Fragen gibt, die denen ähnlich sind, aber keine, die ich gesehen habe, scheint zu erklären, warum dies geschieht:

Philip Pittle 04.12.2014, 15:54
quelle

3 Antworten

17

Sie erstellen eine Aufgabe und starten sie nie, sodass sie nie beendet wird.

Sie sollten Task.Run verwenden, um eine Aufgabe zu erstellen, die Sie sofort ausführen möchten, anstatt den Task -Konstruktor zu verwenden.

    
Servy 04.12.2014, 15:58
quelle
9

Sie müssen Start() für Ihre Aufgabe aufrufen.

Sonst wird es nie enden.

    
SLaks 04.12.2014 15:58
quelle
4

Auch wenn Sie es in

geändert haben %Vor%

es wird möglicherweise immer noch nicht abgeschlossen. Wenn Sie diese Zeile berühren, erstellt das Programm eine Fortsetzungsaufgabe, die nach Abschluss der Aufgabe fortgesetzt wird. Die Tatsache, dass die Aufgabe leer ist, ist irrelevant. An diesem Punkt kehrt der Kontrollfluss zu

zurück %Vor%

wartet auf den Abschluss der Aufgabe und blockiert den aktuellen Thread .

Wenn die Aufgabe abgeschlossen ist, wird versucht, mit dem aktuellen Thread fortzufahren. Dies ist jedoch nicht möglich, da der Thread durch den Aufruf von Wait () blockiert wird.

Ändern Sie die erwartete Zeile in

%Vor%

Dies ist ein häufiges Deadlock-Problem. Mischen Sie nicht Wait () und warten Sie ab. Siehe Ссылка

    
bornfromanegg 04.12.2014 16:06
quelle