Ich habe kürzlich Code gelesen, der viele asynchrone Methoden verwendet, diese aber manchmal synchron ausführen muss. Der Code macht:
Foo foo = GetFooAsync(...).GetAwaiter().GetResult();
Ist das das gleiche wie
Foo foo = GetFooAsync(...).Result;
c#
async-await
Jay Bazuzi
quelle
quelle
GetResult
: "Dieser Typ und seine Mitglieder sind für die Verwendung durch den Compiler vorgesehen." Andere Personen sollten es nicht benutzen.async
await
Antworten:
Ja schon. Ein kleiner Unterschied: Wenn das
Task
fehlschlägt,GetResult()
wird nur die direkt verursachte Ausnahme ausgelöst, währendTask.Result
eine ausgelöst wirdAggregateException
. Was bringt es jedoch, eines davon zu verwenden, wenn es istasync
? Die 100x bessere Option ist zu verwendenawait
.Du sollst es auch nicht benutzen
GetResult()
. Es ist nur für den Compiler gedacht, nicht für Sie. Aber wenn Sie das nervige nicht wollenAggregateException
, verwenden Sie es.quelle
async Task
Unit-Tests und haben seit einiger Zeit.The 100x better option is to use await.
Ich hasseawait
solche Aussagen, wenn ich davor klatschen könnte, würde ich es tun . Aber, wenn ich versuche , wie Asynchron - Code zu arbeiten gegen Nicht-Asynchron - Code zu bekommen , was mich häufig passiert eine Menge in Xamarin, ich am Ende mit Sachen zu verwenden , wieContinueWith
viel, um es nicht zu machen , die UI Deadlock. Bearbeiten: Ich weiß, dass dies alt ist, aber das lindert nicht meine Frustration, Antworten zu finden, die dies ohne Alternativen für Situationen angeben, in denen Sie nicht einfach verwenden könnenawait
.Task.GetAwaiter().GetResult()
wird gegenüberTask.Wait
und bevorzugt,Task.Result
weil es Ausnahmen verbreitet, anstatt sie in eine zu verpackenAggregateException
. Alle drei Methoden können jedoch zu Deadlock- und Thread-Pool-Hungerproblemen führen. Sie sollten alle zugunsten von vermieden werdenasync/await
.Das folgende Zitat erklärt, warum
Task.Wait
und enthältTask.Result
nicht einfach das Ausnahmeverbreitungsverhalten vonTask.GetAwaiter().GetResult()
(aufgrund einer "sehr hohen Kompatibilitätsleiste").https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
quelle
Task.GetAwaiter().GetResult()
gleichbedeutend mitawait task
. Ich gehe davon aus, dass die erste Option verwendet wird, wenn die Methode nicht markiert werden kannasync
(z. B. Konstruktor). Ist das korrekt? Wenn ja, dann kollidiert es mit der Top-Antwort @ It'sNotALieTask.GetAwaiter().GetResult()
ist äquivalenter zuTask.Wait
undTask.Result
(da alle drei synchron blockieren und das Potenzial für Deadlocks haben),Task.GetAwaiter().GetResult()
hat jedoch das Ausnahmeverbreitungsverhalten der Warte-Task.https://github.com/aspnet/Security/issues/59
quelle
Task.WhenAll(task1, task2).GetAwaiter().GetResult();
.Ein weiterer Unterschied besteht darin, dass die
async
Funktion nur zurückgegeben wird,Task
anstatt dassTask<T>
Sie sie nicht verwenden könnenWohingegen
funktioniert noch.
Ich weiß, dass der Beispielcode in der Frage für den Fall ist
Task<T>
, aber die Frage wird allgemein gestellt.quelle
Result
mitGetIntAsync()
demTask<int>
nicht nur zurückgegeben wirdTask
. Ich schlage vor, dass Sie meine Antwort noch einmal lesen.GetFooAsync(...).Result
in eine Funktion zurückkehren können, die zurückkehrtTask
. Dies ist jetzt sinnvoll, da es in C # keine void-Eigenschaften gibt (Task.Result
ist eine Eigenschaft), aber Sie können natürlich eine void-Methode aufrufen.Wie bereits erwähnt, wenn Sie verwenden können
await
. Wenn Sie den Code synchron ausführen müssen, wie Sie es erwähnt haben.GetAwaiter().GetResult()
,.Result
oder wenn.Wait()
ein Risiko für Deadlocks besteht, wie viele in Kommentaren / Antworten angegeben haben. Da die meisten von uns Oneliner mögen, können Sie diese für verwenden.Net 4.5<
Erfassen eines Werts über eine asynchrone Methode:
Synchrones Aufrufen einer asynchronen Methode
Durch die Verwendung von treten keine Deadlock-Probleme auf
Task.Run
.Quelle:
https://stackoverflow.com/a/32429753/3850405
quelle
Quelle: c # 7.0 auf den Punkt gebracht
quelle