Wie Reed sagt, kommt es wirklich auf den Kontext an. Der Code muss unter einige -Punkte laufen - aber abhängig vom Kontext wird er möglicherweise in einem Thread-Pool-Thread ausgeführt, anstatt in einem kritischen Thread.
Anstatt await
zu verwenden, verwende ich TaskEx.Run
:
Soweit ich weiß, ist das im Prinzip eine Möglichkeit, sofort zum Aufrufer zurückzukehren, aber den Rest der asynchronen Methode sofort zu planen. Wenn Sie beispielsweise einen Windows Forms-Benutzeroberflächen-Thread verwenden, ist dies sinnlos, da Sie sofort zum Benutzeroberflächenthread zurückkehren (und dort teuren Code ausführen) - aber es wäre sinnvoll, wenn Sie sich in einem Kontext befinden wo der aktuelle Thread nicht blockiert werden sollte, aber Fortsetzungen auf einem anderen Thread ausgeführt werden.
Es ist nicht unbedingt schlecht, aber es kann unerwartete Folgen haben. Wenn der Aufrufer erwartet, dass sich der Code vollständig asynchron verhält, wird der teure Code synchron ausgeführt. Dies wird dazu führen, dass es sich teilweise wie eine synchrone Methode verhält, aber auch asynchron, was die schlimmste der beiden Welten ist (zusätzliche Komplexität von Asynchronität ohne Repressivität ...)
Wenn möglich, würde ich empfehlen, so wenig "teuren" Code zu haben, der zum ersten Warten führt. Die Verwendung von %code% (oder %code% im CTP) zum Umpacken des teuren Codes oder das Verschieben des teuren Codes in eine eigene asynchrone Methode (auf die Sie %code% anwenden könnten) wäre in diesem Fall von Vorteil.
Wie Reed sagt, kommt es wirklich auf den Kontext an. Der Code muss unter einige -Punkte laufen - aber abhängig vom Kontext wird er möglicherweise in einem Thread-Pool-Thread ausgeführt, anstatt in einem kritischen Thread.
Anstatt Task.Run
zu verwenden, verwende ich TaskEx.Yield
:
Soweit ich weiß, ist das im Prinzip eine Möglichkeit, sofort zum Aufrufer zurückzukehren, aber den Rest der asynchronen Methode sofort zu planen. Wenn Sie beispielsweise einen Windows Forms-Benutzeroberflächen-Thread verwenden, ist dies sinnlos, da Sie sofort zum Benutzeroberflächenthread zurückkehren (und dort teuren Code ausführen) - aber es wäre sinnvoll, wenn Sie sich in einem Kontext befinden wo der aktuelle Thread nicht blockiert werden sollte, aber Fortsetzungen auf einem anderen Thread ausgeführt werden.
Es ist nicht unbedingt schlecht, aber es kann unerwartete Folgen haben. Wenn der Aufrufer erwartet, dass sich der Code vollständig asynchron verhält, wird der teure Code synchron ausgeführt. Dies wird dazu führen, dass es sich teilweise wie eine synchrone Methode verhält, aber auch asynchron, was die schlimmste der beiden Welten ist (zusätzliche Komplexität von Asynchronität ohne Repressivität ...)
Wenn möglich, würde ich empfehlen, so wenig "teuren" Code zu haben, der zum ersten Warten führt. Die Verwendung von Task.Run
(oder TaskEx.Run
im CTP) zum Umpacken des teuren Codes oder das Verschieben des teuren Codes in eine eigene asynchrone Methode (auf die Sie await
anwenden könnten) wäre in diesem Fall von Vorteil.
Tags und Links .net c# task-parallel-library async-ctp