Je viens de voir 3 routines concernant l'utilisation de TPL qui font le même travail; voici le code:
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Better: Create and start the task in one operation.
Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
Je ne comprends pas pourquoi MS donne 3 façons différentes pour exécuter des travaux en TPL parce qu'ils travaillent tous les mêmes: Task.Start()
, Task.Run()
et Task.Factory.StartNew()
.
Dites - moi, sont Task.Start()
, Task.Run()
et Task.Factory.StartNew()
tous utilisés dans le même but ou ont-ils une signification différente?
Quand doit-on utiliser Task.Start()
, quand doit-on utiliser Task.Run()
et quand doit-on utiliser Task.Factory.StartNew()
?
S'il vous plaît, aidez-moi à comprendre leur utilisation réelle selon le scénario en détail avec des exemples, merci.
Task.Run
- peut-être que cela répondra à votre question;)Task.Start
est réellement utile.Réponses:
Task.Run
est un raccourci pourTask.Factory.StartNew
avec des arguments sûrs spécifiques:Il a été ajouté dans .Net 4.5 pour aider à l'utilisation de plus en plus fréquente
async
et au déchargement du travail vers leThreadPool
.Task.Factory.StartNew
(ajouté avec TPL dans .Net 4.0) est beaucoup plus robuste. Vous ne devriez l'utiliser que si celaTask.Run
ne suffit pas, par exemple lorsque vous souhaitez l'utiliserTaskCreationOptions.LongRunning
(bien que ce ne soit pas nécessaire lorsque le délégué est asynchrone. Plus à ce sujet sur mon blog: LongRunning Is Useless For Task.Run With async-await ). Plus sur le sujetTask.Factory.StartNew
dans Task.Run vs Task.Factory.StartNewNe créez jamais un "
Task
and call" àStart()
moins que vous ne trouviez une très bonne raison de le faire. Il ne doit être utilisé que si vous avez une partie qui doit créer des tâches mais pas de planification et une autre partie qui planifie sans créer. Ce n'est presque jamais une solution appropriée et pourrait être dangereuse. Plus d'informations dans "Task.Factory.StartNew" vs "nouvelle tâche (...). Démarrer"En conclusion, utilisez principalement
Task.Run
, utilisezTask.Factory.StartNew
si vous devez et ne l'utilisez jamaisStart
.la source
Task.Start
a sa place pour hériter des types principalement.Réponse courte :
Si vous n'utilisez pas de tâches enfants imbriquées et que vous souhaitez toujours que vos tâches soient exécutées sur le pool de threads, il est préférable de l'utiliser
Task.Run
.Longue réponse:
Task.Run
et lesTask.Factory.StartNew
deux fournissent un support pour la création et la planification d'objets de tâche afin que nous n'ayons pas besoin de créer unTask
appel etStart()
Est équivalent à:
Et
Est équivalent à:
Task.Run
utiliseTaskCreationOptions.DenyChildAttach
ce qui signifie que les tâches des enfants ne peuvent pas être attachées au parent et qu'il utiliseTaskScheduler.Default
ce qui signifie que celui qui exécute les tâches sur le pool de threads sera toujours utilisé pour exécuter des tâches.Task.Factory.StartNew
utiliseTaskScheduler.Current
ce qui signifie le planificateur du thread actuel, cela peut êtreTaskScheduler.Default
mais pas toujours.la source