5

タイムアウトなど、今から X 秒後に発生させる必要がある非定期的なイベントがあるとします。直観的には、System.Timers.Timer を作成し、その間隔を X*1000 に設定し、そのティックをイベントに接続して開始することは理にかなっています。これは繰り返されないイベントであり、一度だけ発生させたい場合は、タイマーが作動した後にタイマーを停止する必要があります。

ただし、タイマーが本質的に繰り返されるという事実は、これが実際にそれを行う最善の方法である場合、私には不信感を抱かせます。開始時間を保存し、タイマーを毎秒 (またはミリ秒) 刻むように設定し、刻々とシステムをポーリングして、必要な時間が経過した場合にのみターゲットイベントを手動で発生させる方が良い/より正確/安全でしょうか?

いずれかの方法が最適である場合、誰でも検討できます(おそらく、私も考えていなかった別のオプションがあります)。待機する必要があるタイムスパンがミリ秒単位で測定される場合、一方の方法が他方よりも優れていますか?

4

6 に答える 6

10

System.Threading.Timer のこのコンストラクターを使用すると、期間を指定できます。このパラメータを -1 に設定すると、定期的なシグナリングが無効になり、1 回だけ実行されます。

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)
于 2008-09-29T13:31:21.393 に答える
5

通常のタイマーを使用し、一度経過したら無効にします。それはあなたの問題を解決するはずです。

system.threading.timer と system.timers.timer の両方がこれをサポートしています。

于 2008-09-29T13:15:00.497 に答える
2

新しい BackgroundWorker をスピンオフし、スリープして、閉じます。

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();
于 2008-09-29T13:16:59.197 に答える
1

AutoReset = trueのSystem.Timers.Timer、または無限周期(System.Threading.Timeout.Infinite = -1)のSystem.Threading.Timerを使用して、タイマーを1回実行できます。

いずれの場合も、定期的な間隔がない場合は、タイマーを終了したときに(Timers.TimerのイベントハンドラーまたはThreading.Timerのコールバックで)タイマーを破棄する必要があります。

于 2008-09-29T21:10:42.443 に答える
0

正確な時間測定が必要な場合は、タイマーの頻度を 2 倍にし、DateTime.Now を使用して開始時刻と比較することを検討してください。タイマーと Thread.Sleep の時間測定は必ずしも正確ではありません。

于 2008-09-29T14:02:46.967 に答える
0

X秒後にティックするように設定し、ティックのコードで次のようにします。

timer.enabled = false;

私のために働いた。

于 2008-09-29T13:23:50.897 に答える