まず、この小さなテストを実行して、ほぼリアルタイムでドリフトを確認する必要があります。72回のタイマー経過イベントの後に1秒が失われます(これは実際の作業がほとんどない場合です)。
using (var timer = new Timer(1000))
{
var start = DateTime.Now;
var i = 0;
timer.Elapsed += (sender, args) => Console.WriteLine("{0} -> {1}", ++i, (DateTime.Now - start).TotalMilliseconds);
timer.Start();
Thread.Sleep(130*1000);
}
アプリがどれほど正確である必要があるかはわかりませんが、開始時間と現在のデルタを使用し、それを初期値から差し引いてタイマーをゼロにすることで、「十分に良い」ものを得ることができます。 このアプローチでは秒を失うことになり、秒を失う可能性があります@ダニ0:00
を引き起こし-0:01
ます。これを処理する必要があります。
var countdownSeconds = 120;
var startedAt = DateTime.Now;
var timer = new Timer(1000);
timer.Elapsed += (sender, args) => Display(countdownSeconds - (int)((DateTime.Now - startedAt).TotalSeconds));
timer.Start();
//- be sure to dispose the timer