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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top