.NET Timers: O que está é a melhor maneira de ser notificado em X segundos?
-
02-07-2019 - |
Pergunta
Suponha que eu tenho um evento não recorrente que precisa ser levantada X segundos a partir de agora, como um tempo limite. Intuitivamente, faria sentido criar uma System.Timers.Timer, definir seu intervalo para X * 1000, arame sua tick-se ao evento e iniciá-lo. Uma vez que este é um evento não-recorrente e você só quer que ele levantou uma vez que você teria, então, para parar o temporizador depois de carrapatos.
O fato de que Timers são inerentemente recorrentes no entanto faz-me desconfiado se esta é realmente a melhor maneira de fazê-lo. Seria melhor / mais precisa / mais seguro para economizar o tempo começou, definir o temporizador para assinalar a cada segundo (ou mesmo milissegundo) e na pesquisa carrapato do sistema para o tempo e manualmente aumentar o evento-alvo apenas uma vez o tempo necessário tenha decorrido?
Alguém pode pesar sobre o que se quer é o melhor método (talvez não há outra opção que não pensa em também). Será que um método de tornar-se melhor do que o outro se o período de tempo que eu preciso de espera é medido em milissegundos?
Solução
Este construtor para o System.Threading.Timer permite para especificar um período . Se você definir esse parâmetro para -1, ele irá desativar sinalização periódica e só executar uma vez.
public Timer(
TimerCallback callback,
Object state,
TimeSpan dueTime,
TimeSpan period
)
Outras dicas
apenas usar um temporizador normal e desativá-lo depois de ter decorrido uma vez. que deve resolver o seu problema.
ambos, System.Threading.Timer e apoio System.Timers.Timer isso.
spin off um BackgroundWorker novo, sono, perto.
var worker = new BackgroundWorker();
worker.DoWork += delegate {
Thread.Sleep(30000);
DoStuff();
}
worker.RunWorkerAsync();
É possível utilizar um System.Timers.Timer com AutoReset = verdadeira, ou um System.Threading.Timer com um período infinito (System.Threading.Timeout.Infinite = -1) para executar um temporizador de uma vez.
Em ambos os casos, você deve descartar seu temporizador quando tiver terminado com ele (no manipulador de eventos para um Timers.Timer ou a chamada de retorno para uma Threading.Timer) se você não tiver um intervalo de recorrência.
apenas configurá-lo para assinalar após X segundos, e no código do carrapato, fazer:
timer.enabled = false;
funcionou para mim.
Se você quiser uma medida de tempo exato, você deve considerar a duplicação da frequência de temporizador e usando DateTime.Now para comparar com o seu horário de início. Temporizadores e Thread.Sleep não são necessariamente exata em suas medições de tempo.