Timer .NET: qual è il modo migliore per ricevere una notifica in X secondi?
-
02-07-2019 - |
Domanda
Supponiamo di avere un evento non ricorrente che deve essere aumentato di X secondi da adesso come un timeout. Intuitivamente avrebbe senso creare un System.Timers.Timer, impostare il suo intervallo su X * 1000, collegare il segno di spunta all'evento e avviarlo. Dal momento che si tratta di un evento non ricorrente e lo desideri generato solo una volta, dovresti quindi arrestare il timer dopo che è spuntato.
Il fatto che i timer siano intrinsecamente ricorrenti mi rende diffidente se questo è davvero il modo migliore per farlo. Sarebbe meglio / più accurato / più sicuro salvare il tempo avviato, impostare il timer in modo che ticchetta ogni secondo (o addirittura millisecondo) e in caso di tick poll il sistema per tempo e aumentare manualmente l'evento target solo una volta trascorso il tempo richiesto?
Qualcuno può ponderare su quale dei due metodi sia il migliore (forse c'è un'altra opzione a cui non ho pensato troppo). Un metodo diventa migliore dell'altro se il periodo di tempo che devo attendere viene misurato in millisecondi?
Soluzione
Questo costruttore per System.Threading.Timer ti consente per specificare un periodo . Se imposti questo parametro su -1, disabiliterà la segnalazione periodica e verrà eseguito una sola volta.
public Timer(
TimerCallback callback,
Object state,
TimeSpan dueTime,
TimeSpan period
)
Altri suggerimenti
basta usare un normale timer e disabilitarlo dopo che è trascorso una volta. questo dovrebbe risolvere il tuo problema.
entrambi, system.threading.timer e system.timers.timer supportano questo.
Elimina un nuovo BackgroundWorker, dormi, chiudi.
var worker = new BackgroundWorker();
worker.DoWork += delegate {
Thread.Sleep(30000);
DoStuff();
}
worker.RunWorkerAsync();
Puoi usare System.Timers.Timer con AutoReset = true o System.Threading.Timer con un periodo infinito (System.Threading.Timeout.Infinite = -1) per eseguire un timer una volta.
In entrambi i casi, è necessario disporre il timer quando si è finito con esso (nel gestore eventi per un timer timer o il callback per un timer threading) se non si dispone di un intervallo ricorrente.
basta impostarlo per spuntare dopo X secondi, e nel codice del tick, fare:
timer.enabled = false;
ha funzionato per me.
Se si desidera una misurazione del tempo accurata, è necessario raddoppiare la frequenza del timer e utilizzare DateTime.Ora per confrontare con l'ora di inizio. Timer e Thread. Il sonno non è necessariamente esatto nelle loro misurazioni del tempo.