Fabrício Rissetto
Construir um worker para tratamento de eventos
 Obter um número X de eventos através de uma queue
 Enviar esses eventos para uma API paralelamente
var listaEventos = Enumerable.Range(1, 1000);
Parallel.ForEach(listaEventos,
(idEvento) =>
{
ChamadaParaWebService(idEvento);
});
var listaEventos = Enumerable.Range(1, 1000);
listaEventos.ToList().ForEach((idEvento) =>
{
Task.Run(() =>
{
ChamadaParaWebService(idEvento);
});
});
Visa evitar o overhead da criação excessiva de threads
através do uso de um “pool”
Reaproveitamento
 Criação e destruição de threads é um processo custoso
 Chamadas SO
 Alocação e desalocação de bloco de memória
 Context Switch
Não atolar o CPU
Thread
IO Bound
 Leituras ou escritas em
arquivos
 Chamadas para APIs ou WS
 Escritas em banco de dados
Thread Pool
CPU Bound
 Cálculos hash
 Operações em matrizes
 Algoritmos recursivos
 Operações de reflection
var quantidadeThreads = 100;
for (int i = 0; i < quantidadeThreads; i++)
{
new Thread(new ThreadStart(() =>
{
while (true)
{
ObtemEventoDaFilaEChamaWebService();
}
})).Start();
}
new Thread(new ThreadStart(() =>
{
//...
})).Start();
Task.Factory.StartNew(() =>
{
//Operação resource bound
}, TaskCreationOptions.LongRunning);
Tasks podem retornar resultados
Com o Wait é possível esperar por várias tasks sem
precisar construir um mecanismo de sinais
Tasks podem ter sua execução encadeada com facilidade
Tasks suportam cancelamento de maneira simples via
token de cancelamento
Exceptions em tasks filhas propagam para tasks pais
E-mail: fabriciorissetto@gmail.com
Blog: fabriciorissetto.com
Obrigado!

Threads Tasks e o tal do Thread Pool

  • 1.
  • 2.
    Construir um workerpara tratamento de eventos  Obter um número X de eventos através de uma queue  Enviar esses eventos para uma API paralelamente
  • 3.
    var listaEventos =Enumerable.Range(1, 1000); Parallel.ForEach(listaEventos, (idEvento) => { ChamadaParaWebService(idEvento); });
  • 4.
    var listaEventos =Enumerable.Range(1, 1000); listaEventos.ToList().ForEach((idEvento) => { Task.Run(() => { ChamadaParaWebService(idEvento); }); });
  • 5.
    Visa evitar ooverhead da criação excessiva de threads através do uso de um “pool” Reaproveitamento  Criação e destruição de threads é um processo custoso  Chamadas SO  Alocação e desalocação de bloco de memória  Context Switch Não atolar o CPU
  • 6.
    Thread IO Bound  Leiturasou escritas em arquivos  Chamadas para APIs ou WS  Escritas em banco de dados Thread Pool CPU Bound  Cálculos hash  Operações em matrizes  Algoritmos recursivos  Operações de reflection
  • 7.
    var quantidadeThreads =100; for (int i = 0; i < quantidadeThreads; i++) { new Thread(new ThreadStart(() => { while (true) { ObtemEventoDaFilaEChamaWebService(); } })).Start(); }
  • 8.
    new Thread(new ThreadStart(()=> { //... })).Start(); Task.Factory.StartNew(() => { //Operação resource bound }, TaskCreationOptions.LongRunning);
  • 9.
    Tasks podem retornarresultados Com o Wait é possível esperar por várias tasks sem precisar construir um mecanismo de sinais Tasks podem ter sua execução encadeada com facilidade Tasks suportam cancelamento de maneira simples via token de cancelamento Exceptions em tasks filhas propagam para tasks pais
  • 10.