Temporizador C# que é acionado a cada X segundos, mas permanece sincronizado com o tempo real (ou seja,sem deriva)

StackOverflow https://stackoverflow.com/questions/3296784

  •  18-09-2020
  •  | 
  •  

Pergunta

Existe um temporizador .NET disponível em C# que pode garantir que não haja "desvio" entre os eventos?Ou seja, se você configurar o cronômetro para disparar a cada X segundos, após dias de operação ele não irá desviar, ou seja,para garantir que o número aproximado de eventos de X segundos em um dia permaneça sincronizado com o que deveria ser?

Caso contrário, existe um exemplo de código bem conhecido que agruparia uma função Timer em C# para fazer isso?

Foi útil?

Solução

desculpe por apenas fornecer um link para quartzo.net, mas esta é uma empresa totalmente qualificada, testada e ...biblioteca ...você não precisa reinventar a roda :)

se você se preocupa com despesas gerais, qual é a sua definição de despesas gerais?é o tamanho do arquivo (os binários têm cerca de 0,5 MB) ou a sobrecarga na lógica.bem para a parte lógica:eu acho que implementar seus IJob-interface faz um bom trabalho para forçar um código melhor do consumidor.não sou muito amigo dos métodos inline (apenas por exemplo, como você pode disparar seus ponteiros no decorrer do cronômetro) - as classes lhe dariam muito mais possibilidades e, mais uma vez, forçariam melhor oop, design de domínio, .. .

mas:fazendo Console.WriteLine(...) com quartz.net seria um exagero ...:)

Outras dicas

Presumo que você já tenha tentado algo e que isso esteja acontecendo.

Se você quiser que algo dispare, digamos, a cada 5 segundos a partir da hora (5,10,15,20..), você pode configurar seu cronômetro para disparar uma vez e, em seu retorno de chamada, redefinir o cronômetro para disparar em DateTime.Now + número de segundos até o próximo intervalo de 5 segundos.

Isso evitaria qualquer desvio, desde que o relógio estivesse correto.

Algo assim

System.Timers.Timer timer = new Timer();

void Init()
{
    timer.Elapsed += timer_Elapsed;
    int wait = 5 - (DateTime.Now.Second % 5);
    timer.Interval = wait*1000;
    timer.Start();
}


void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    timer.Stop();
    int wait = DateTime.Now.Second % 5;
    timer.Interval = wait * 1000;
    timer.Start();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top