Estou começando a aprender sobre as novas bibliotecas Threading e Parallel em .Net 4
No passado, eu criaria um novo Thread como este (como exemplo):
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();
Agora posso fazer:
Task t = Task.Factory.StartNew(() =>
{
ThreadProcedure();
});
Qual é a diferença se houver?
obrigado
Respostas:
Há uma grande diferença. As tarefas são agendadas no ThreadPool e podem até ser executadas de forma síncrona, se apropriado.
Se você tiver um trabalho em segundo plano de longa execução, deverá especificá-lo usando a opção de tarefa correta.
Você deve preferir a Biblioteca Paralela de Tarefas em vez do tratamento de thread explícito, pois é mais otimizada. Além disso, você tem mais recursos como Continuação.
fonte
A tarefa oferece todas as vantagens da API de tarefa:
Task.ContinueWith
)Observe que, em ambos os casos, você pode tornar seu código um pouco mais simples com conversões de grupo de métodos:
fonte
Thread
é um nível muito baixo em comparação comTask
(tenho uma postagem no blog que entra em detalhes). Estou dando uma palestra do tipo "usando tarefas no mundo real" no Grand Rapids DevDay . A conversa é chamada de "Thread is Dead", porque não há mais necessidade deThread
(a menos que você esteja implementando umTaskScheduler
).Thread
está morto, quando se trata de ser usado como um thread de segundo plano?Thread
fazer (ouBackgroundWorker
) que não possa ser feito de forma mais eleganteTask
e apropriadaTaskScheduler
.Thread
?Task
seja executado em um thread específico, use um apropriadoTaskScheduler
- por exemploAsyncContextThread
,. No entanto, isso geralmente não é necessário; oSynchronizationContext
,ThreadPool
, eConcurrentExclusiveSchedulerPair
programadores são suficientes para a maioria dos programas.No primeiro caso, você está simplesmente iniciando um novo encadeamento, enquanto no segundo caso está entrando no pool de encadeamentos.
O trabalho do pool de threads é compartilhar e reciclar threads. Isso permite evitar a perda de alguns milissegundos cada vez que precisamos criar um novo thread.
Existem várias maneiras de entrar no pool de threads:
fonte
Seu primeiro bloco de código diz ao CLR para criar um Thread (digamos. T) para você, que pode ser executado como plano de fundo (use threads do pool de threads ao agendar T). Em suma, você pede explicitamente ao CLR para criar um thread para você fazer algo e chamar o método Start () no thread para iniciar.
Seu segundo bloco de código faz o mesmo, mas delega (entrega implicitamente) a responsabilidade de criar o encadeamento (segundo plano - que novamente é executado no pool de encadeamentos) e o encadeamento inicial por meio do método StartNew na implementação do Task Factory.
Esta é uma diferença rápida entre determinados blocos de código. Dito isso, existem poucas diferenças detalhadas que você pode pesquisar no Google ou ver outras respostas de meus colegas colaboradores.
fonte