.NETタイマー:X秒で通知を受ける最良の方法は何ですか?
-
02-07-2019 - |
質問
タイムアウトなど、今からX秒後に発生させる必要がある非定期的なイベントがあるとします。直観的には、System.Timers.Timerを作成し、その間隔をX * 1000に設定し、その目盛りをイベントに配線して開始するのが理にかなっています。これは非定期的なイベントであり、一度だけ発生させたい場合は、タイマーが止まった後にタイマーを停止する必要があります。
タイマーが本質的に繰り返しているという事実は、これが実際にそれを行う最良の方法である場合、私は不信になります。開始時間を保存し、タイマーを毎秒(またはミリ秒)刻みに設定し、刻々とシステムを時間ポーリングして、必要な時間が経過した後にのみ手動でターゲットイベントを発生させる方が良いでしょうか? / p>
いずれかの方法が最適な場合、誰もが考慮に入れることができます(おそらく、私も考えていなかった別のオプションがあります)。待機する必要があるタイムスパンがミリ秒単位で測定されている場合、1つの方法が他の方法よりも良くなりますか?
解決
System.Threading.Timerのコンストラクタにより、 期間を指定します。このパラメーターを-1に設定すると、定期的なシグナリングが無効になり、1回だけ実行されます。
public Timer(
TimerCallback callback,
Object state,
TimeSpan dueTime,
TimeSpan period
)
他のヒント
通常のタイマーを使用し、一度経過すると無効にします。 これで問題が解決するはずです。
両方、system.threading.timerおよびsystem.timers.timerはこれをサポートします。
新しいBackgroundWorkerをスピンオフして、スリープし、閉じます。
var worker = new BackgroundWorker();
worker.DoWork += delegate {
Thread.Sleep(30000);
DoStuff();
}
worker.RunWorkerAsync();
AutoReset = trueのSystem.Timers.Timer、または無限の期間(System.Threading.Timeout.Infinite = -1)のSystem.Threading.Timerを使用して、タイマーを1回実行できます。
いずれの場合も、繰り返し間隔がない場合は、(Timers.TimerのイベントハンドラーまたはThreading.Timerのコールバックで)終了したらタイマーを破棄する必要があります。
X秒後にティックするように設定し、ティックのコードで以下を実行します。
timer.enabled = false;
私のために働いた。
正確な時間測定が必要な場合は、タイマー周波数を2倍にし、DateTime.Nowを使用して開始時間と比較することを検討する必要があります。タイマーとThread.Sleepの時間測定は必ずしも正確ではありません。