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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top