Cronômetro confiável em um aplicativo de console

103

Estou ciente de que no .NET existem três tipos de cronômetro (consulte Comparando as classes de cronômetro na biblioteca de classes do .NET Framework ). Escolhi um cronômetro encadeado, pois os outros tipos podem flutuar se o encadeamento principal estiver ocupado, e preciso que isso seja confiável.

A maneira como esse cronômetro funciona no controle do cronômetro é colocada em outro encadeamento para que possa sempre marcar junto com o início do trabalho concluído no encadeamento pai quando não estiver ocupado.

O problema com esse cronômetro em um aplicativo de console é que, enquanto o cronômetro está passando em outro encadeamento, o encadeamento principal não faz nada para que o aplicativo feche.

Tentei adicionar um while trueloop, mas o thread principal está muito ocupado quando o cronômetro dispara.

John
fonte

Respostas:

59

Você pode usar algo como Console.ReadLine()bloquear o encadeamento principal, para que outros encadeamentos em segundo plano (como encadeamentos de cronômetro) ainda funcionem. Você também pode usar um AutoResetEvent para bloquear a execução, então (quando necessário) você pode chamar o método Set () naquele objeto AutoResetEvent para liberar o thread principal. Certifique-se também de que sua referência ao objeto Timer não saia do escopo e não seja coletada pelo lixo.

Huseyint
fonte
20

Considere usar um ManualResetEvent para bloquear o encadeamento principal no final de seu processamento e chamá Reset()-lo assim que o processamento do temporizador terminar. Se isso é algo que precisa ser executado continuamente, considere mover isso para um processo de serviço em vez de um aplicativo de console.

Greg Hurlman
fonte