utilise un lambda `async` avec` Task.Run () `redondant?
Je viens de tomber sur un code comme:
var task = Task.Run(async () => { await Foo.StartAsync(); });
task.Wait();
(Non, je ne connais pas les rouages de Foo.StartAsync()
). Ma première réaction serait de se débarrasser de async
/await
et de réécrire comme:
var task = Foo.StartAsync();
task.Wait();
Serait-ce correct ou pas (à nouveau, ne sachant rien du tout sur la Foo.StartAsync()
). Cette réponse à Quelle différence cela fait-il - de l'exécution d'une "asynchrone" action de déléguer une Tâche.Exécuter ... semble indiquer qu'il peut y avoir des cas où il peut faire sens, mais elle dit aussi: "Pour dire la vérité, je n'ai pas vu que beaucoup des scénarios ..."
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Normalementle prévu utilisation pour
Task.Run
est à exécuter par le CPU code sur un non-thread d'INTERFACE utilisateur. En tant que tel, il serait assez rare pour être utilisé avec unasync
délégué, mais il est possible (par exemple, pour le code qui est à la fois asynchrone et le CPU portions).Cependant, c'est l'utilisation prévue. Je pense que dans ton exemple:
Il est beaucoup plus probable que l'auteur tente de façon synchrone sur le bloc de code asynchrone, et (ab)à l'aide de
Task.Run
à éviter les blocages commun dans cette situation (comme je l'ai décrit sur mon blog).En substance, il semble que le "pool de threads hack" que je décris dans mon l'article sur les friches industrielles du code asynchrone.
La meilleur solution est de ne pas utiliser
Task.Run
ouWait
:Ce sera la cause de
async
de croître par le biais de votre base de code, qui est la meilleure approche, mais il peut provoquer une quantité inacceptable de travail pour vos développeurs droit maintenant. C'est probablement pourquoi votre prédécesseur utiliséTask.Run(..).Wait()
.La plupart oui.
À l'aide de
Task.Run
comme cela est principalement utilisé par des gens qui ne comprennent pas comment exécuter une méthode asynchrone.Cependant, il y a une différence. À l'aide de
Task.Run
signifie à partir de la méthode asynchrone sur unThreadPool
fil.Cela peut être utile lorsque la méthode asynchrone synchrone du partie (la partie avant le premier attendent) est importante et que l'appelant veut s'assurer que la méthode n'est pas bloquant.
Cela peut aussi être utilisé pour "sortir" le contexte actuel, par exemple, où il n'y a pas un
SynchronizationContext
.