Ich verstehe, dass Aufruf task.Result
in einer async
Methode zu Deadlocks führen kann. Ich habe einen anderen Twist auf die Frage, obwohl ...Ist es in Ordnung, task.Result in einer asynchronen Methode aufzurufen, wenn Sie wissen, dass die Aufgabe abgeschlossen ist?
Ich finde mich dieses Muster viel zu tun. Ich habe mehrere Aufgaben, die die gleichen Ergebnisse liefern, so dass ich sie alle gleichzeitig abwarten kann. Ich möchte die Ergebnisse separat verarbeiten, aber:
Task<int> t1 = m1Async();
Task<int> t2 = m2Async();
await Task.WhenAll(t1, t2);
Ist es ok Result
hier zu nennen, da ich die Aufgaben sind nun abgeschlossen wissen?
int result1 = t1.Result;
int result2 = t2.Result;
Oder sollte ich await
verwenden immer noch ... es scheint überflüssig und kann ein bisschen hässlicher sein, je nachdem, wie ich brauche, um die Ergebnisse zu verarbeiten:
int result1 = await t1;
int result2 = await t2;
Update: markierte Jemand meine Frage als ein Duplikat von diesem: Awaiting multiple Tasks with different results. Die Frage ist anders, weshalb ich sie nicht in meinen Suchen gefunden habe, obwohl eine der detaillierten Antworten, die dort beantwortet werden, auch in Frage gestellt werden kann.
Ja, es ist in Ordnung, das Ergebnis aufzurufen, wenn Sie es wissen. Wenn Sie jedoch .Result nach WhenAll aufrufen und t1 oder t2 eine Ausnahme auslösen, ist .Result problematisch. –
Ich habe einige Posts gesehen, die sich auf verschiedene Verhaltensweisen mit Ausnahmen beziehen, aber ich muss noch etwas näher darauf eingehen, um alles zu verstehen. Vielen Dank für Ihre schnelle Antwort! – Cary
Eine Sache, die Sie wissen sollten. Es gibt einen Leistungsüberhang beim Aufrufen von "erwarten" für eine Aufgabe, die sich bereits in dem abgeschlossenen Zustand befindet. Die Statusmaschine, die generiert wird, prüft diese Bedingung und springt einfach nach rechts, um '.Result' intern aufzurufen (sie ruft' .GetAwaiter(). GetResult() 'auf, aber sie hat denselben Overhead wie nur' .Result' aufzurufen)). Für mich gibt es also keinen zwingenden Grund, ".Result" jemals in einer Methode zu verwenden, die bereits als "async" markiert ist. –