Acabei de ver 3 rotinas sobre o uso de TPL que fazem o mesmo trabalho; aqui está o código:
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(); }
Eu simplesmente não entendo porque o MS oferece três maneiras diferentes de executar tarefas no TPL, porque todas elas funcionam da mesma maneira: Task.Start()
, Task.Run()
e Task.Factory.StartNew()
.
Diga-me, Task.Start()
, Task.Run()
e Task.Factory.StartNew()
todos usados para o mesmo propósito ou têm significados diferentes?
Quando alguém deve usar Task.Start()
, quando deve usar Task.Run()
e quando deve usar Task.Factory.StartNew()
?
Por favor me ajude a entender o seu uso real, conforme cenário em grande detalhe com exemplos, obrigado.
Task.Run
é um atalho para Task.Factory.StartNew
com argumentos seguros específicos:
Task.Factory.StartNew( action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
Foi adicionado no .net 4.5 para ajudar com o uso cada vez mais freqüente de trabalho async
e offloading para o ThreadPool
.
Task.Factory.StartNew
(adicionado com o TPL no .Net 4.0) é muito mais robusto. Você só deve usá-lo se Task.Run
não for suficiente, por exemplo, quando você quiser usar TaskCreationOptions.LongRunning
(embora seja desnecessário quando o delegado é asynchronous. Mais sobre isso no meu blog: LongRunning é inútil para Task.Run com async – espera ). Mais sobre Task.Factory.StartNew
em Task.Run vs Task.Factory.StartNew
Nunca crie uma Task
e chame Start()
menos que você encontre uma boa razão para isso. Ele só deve ser usado se você tiver alguma parte que precise criar tarefas, mas não agendá-las e outra parte que programe sem criar. Isso quase nunca é uma solução adequada e pode ser perigoso. Mais em “Task.Factory.StartNew” vs “nova tarefa (…). Iniciar”
Em conclusão, use principalmente Task.Run
, use Task.Factory.StartNew
se você precisar e nunca usar o Start
.