Y a-t-il une différence fonctionnelle entre ces deux formes d'utilisation de wait?
string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
Task<string> myTask = new Task<string>(() => GetAnimal("feline"));
myTask.Start();
string z = await myTask;
Plus précisément, dans quel ordre chaque opération est-elle appelée en 1.? StartNew est-il appelé, puis attend-il, ou attend-il d'abord en 1.?
StartNew
n'est qu'un raccourci pour créer et démarrer une tâche . Si vous voulez faire quelque chose à l'instance Task
avant de la démarrer, utilisez le constructeur. Si vous souhaitez simplement créer et démarrer la tâche immédiatement, utilisez la main courte.
La documentation pour StartNew
dit:
Appeler StartNew équivaut fonctionnellement à créer une tâche à l'aide de l'un de ses constructeurs, puis à appeler la méthode Task.Start pour planifier l'exécution de la tâche.
Lorsque vous écrivez du code avec async
et await
, vous devez utiliser Task.Run
dès que possible.
Le constructeur Task
(et Task.Start
) sont des restes de la bibliothèque parallèle de tâches, utilisés pour créer des tâches qui n'ont pas encore été démarrées. Le constructeur Task
et Task.Start
ne doit pas être utilisé dans le code async
.
De même, TaskFactory.StartNew
est une méthode plus ancienne qui n'utilise pas les meilleures valeurs par défaut pour les tâches async
et ne comprend pas async
lambdas. Il peut être utile dans quelques situations, mais la grande majorité du temps Task.Run
est préférable pour le code async
.