web-dev-qa-db-fra.com

attendre Task.Factory.StartNew (() => vs Task.Start; attendre Task;

Y a-t-il une différence fonctionnelle entre ces deux formes d'utilisation de wait?

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
    
  2. 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.?

26
user42

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.

16
Brian Rasmussen

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.

28
Stephen Cleary