web-dev-qa-db-fra.com

Task.Factory.StartNew vs new Task

Est-ce que quelqu'un sait s'il y a une différence entre faire Task.Factory.StartNew contre new Task suivi de l'appel de Start sur la tâche. En regardant le réflecteur, il ne semble pas y avoir beaucoup de différence. Alors peut-être que la seule différence est que Task.Factory.StartNewretourne une tâche déjà démarrée. Est-ce correct?

Je le sais Task.Factory.StartNewet Task.Run ont différentes options par défaut et Task.Run est l'option préférée pour .Net 4.5.

54
Ned Stoyanov

J'ai trouvé this excellent article de Stephen Toub, qui explique qu'il y a en fait une pénalité de performance lors de l'utilisation de new Task(...).Start(), car la méthode de démarrage doit utiliser la synchronisation pour s'assurer que la tâche n'est que prévu une fois.

Son conseil est de préférer utiliser Task.Factory.StartNew pour .net 4.0. Pour .net 4.5 Task.Run est la meilleure option .

53
Ned Stoyanov

En fait dans l'article de Stephen Toub il spécifie que Task.Run () est exactement équivalent à l'utilisation de Task.Factory.StartNew () avec les paramètres par défaut:

Task.Factory.StartNew(someAction, 
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
17
o_c