Threads e Loops infinitos tem um desempenho grande no consumo de processamento?

Estou construindo um conjunto Cliente/Servidor, onde o servidor é em C# e o cliente é em C++ nativo.

O meu servidor fica escutando uma determinada porta, aguardando a conexão de alguns clientes, o servidor também é multitarefa, podendo aceitar diversas conexões simultaneamente, porém estou com um problema muito preocupante, veja:

Até agora usei duas threads as duas executam um laço de repetição infinito:

  1. A primeira thread(com o laço infinito) fica constantemente verificando se há novas conexões a serem aceitas, se existe alguma, ela adiciona a conexão em um List<TcpClient>.
  2. A segunda thread (também com loop infinito) fica constantemente verificando se essas conexões estão ativas, ou seja, se alguma delas não estiver, ele remove ela do List<TcpClient>.

O meu problema é que quando fui monitorar o consumo de recursos da aplicação pelo gerenciador de tarefas, percebi que está consumindo incríveis 30% do meu processador (I5 4460 3.2 GHz). Estou achando esse consumo absurdo para uma aplicação relativamente simples.

  • Laços de repetições infinitos consomem tanto assim?
  • Ou o fato de usar Threads já contribui para esse consumo?
  • Como eu poderia resolver este problema?
1 curtida

Posta seu código que fica mais fácil analisarem o problema.

Como não postou código, de chute pra esse tipo de caso geralmente tem que dar um respiro pro processo, a maneira mais fácil é usar Thread.Sleep, mas existem formas melhores, que não sei de cabeça no momento, você teria que pesquisar melhores soluções dentro dessa ideia.

while (true) 
{
    //SuaRotina();
    Thread.Sleep(1); //máximo que puder de ms conforme necessidade
}

Cara, muito obrigado pela resposta, foi exatamente isso que fiz, demorei um tempo até perceber que o processador estava tão dedicado em iterar o loop que não sobrava poder de processamento para outras tarefas, então eu lembrei do Thread.Sleep exatamente como você postou, agora o processo não chega a 1%. Show de bola!

1 curtida

Cara, eu não conheço C# muito bem, mas será que não existe um socket com espera bloqueante não ?

rmendes08, muito obrigado por tentar ajudar, mas eu já resolvi o problema com o Thrad.Sleep(); é só fazer a thread dormir por alguns segundos, agora o processo não consome nem 1% de CPU.