c # 5 async als Zuckersyntax (oder nicht)?

8

Also fragte ich diese Frage nach async , und ich dachte, dass es nur eine Zuckersyntax für:

ist

Task<..>...ContinueWith...

Und überprüfen Sie schließlich die Eigenschaft Result .

Ich habe sogar eine Frage dazu gestellt hier und mir wurde gesagt:

Aber heute Ich wurde von Jon Skeet korrigiert

"Es ist ein sehr langer Weg von diesem".

Was sind die Hauptunterschiede zwischen diesen beiden Ansätzen?

    
Royi Namir 29.06.2013, 19:49
quelle

1 Antwort

15

Es fügt eine Fortsetzung hinzu - aber das manuelle Konstruieren dieser Fortsetzung kann sehr schmerzhaft sein, da wir alle Informationen darüber, wohin wir gegangen sind und was der lokale Zustand ist, mit sich herumtragen müssen.

Als einfaches sehr Beispiel schlage ich vor, dass Sie versuchen, das Äquivalent dieser asynchronen Methode zu finden:

%Vor%

Versuche wirklich, das Äquivalent der ersten Methode zu finden. Ich denke, Sie werden feststellen, dass es eine Menge Code benötigt - vor allem , wenn Sie tatsächlich jedes Mal zu einem passenden Thread zurückkehren möchten. (Stellen Sie sich vor, dass der Code in dieser asynchronen Methode beispielsweise auch eine WPF-Benutzeroberfläche geändert hat.) Ach, und stellen Sie sicher, dass Ihre zurückgegebene Aufgabe auch fehlschlägt, wenn eine der Aufgaben fehlschlägt. (Die asynchrone Methode wird den Fehler der zweiten Task tatsächlich "verfehlen", wenn die erste Task ebenfalls fehlschlägt, aber das ist ein relativ kleines Problem IMO.)

Als nächstes sollten Sie herausfinden, wie Sie Ihren Code ändern müssten, wenn Sie in der Methode try den Gegenwert von finally / async benötigen. Auch das macht die nicht-asynchrone Methode komplizierter. Es kann alles getan werden, aber es ist ein Schmerz im Nacken.

Also ja, es ist "nur" syntaktischer Zucker. So ist foreach . So ist eine for Schleife (oder jede andere Art von Schleife). Im Fall von async / await ist es syntaktischer Zucker, der wirklich viel tun kann, um deinen Code zu transformieren.

Es gibt viele von Videos und Blog-Posts rund um async, und ich würde erwarten, dass das bloße Anschauen / Lesen von ein paar davon Ihnen genügend Einsicht gibt, um zu verstehen, dass dies keine kleine Veränderung ist: it radikal ändert, wie praktisch es ist, große Mengen von asynchronem Code korrekt zu schreiben.

Darüber hinaus funktioniert ascented / await nicht nur only , sondern funktioniert auch auf Task / Task<T> . Sie können alles erwarten, was dem erwarteten Muster entspricht. In der Praxis werden sehr wenige Entwickler das Muster selbst implementieren müssen, aber es ermöglicht Methoden wie Task.Yield , die eine YieldAwaitable eher als eine Aufgabe.

    
Jon Skeet 29.06.2013, 19:54
quelle

Tags und Links