複数のカウントダウン タイマーを実行する必要があるアプリケーションがあります (いくつかは同時に)。また、カウントダウンの残り時間で UI 要素を更新します。UI要素とやり取りする簡単な方法であるため、DispatcherTimerを使用してみました。ただし、300 秒のカウントダウンを超えると、(UI の更新が多いため) リアルタイムと同期しなくなり、タイマーが 0 になるはずのときにタイマーの残り時間が 30 秒になるまでになります。
次に、System.Threading.Timer (以下のコード) に切り替えてみました。現在、タイマーはスポットオンで、実際の時間と同期しています。ただし、Timer は、ランダムな数のティック (3 秒から 60 秒の間) の後、ティックを停止します。ガベージ コレクターが起動しているか、Invoke (UI の更新に使用) のいずれかであると思われますが、このパスを続行するための知識は実際にはありません。タイマーがランダムに停止する理由について、誰かが私に洞察を与えることができますか?
private int counter = 500;
private void btnTopBlue_Click(object sender, RoutedEventArgs e)
{
btnTopBlue.Content = counter.ToString();
Timer dt = new Timer(topBlue_Tick, null, 1000, 1000);
}
private void topBlue_Tick(object sender)
{
if (counter > 0)
{
counter--;
Dispatcher.BeginInvoke(() => btnTopBlue.Content = counter.ToString());
}
else
((Timer)sender).Dispose();
}