簡単な方法は、タイマー (ストップウォッチではなく) を使用することです。タイマーは、間隔を設定し、各ティックでメソッドを呼び出すことができるコンポーネントです。ストップウォッチのデータ メンバーと組み合わせると、たとえば、ストップウォッチの Elapsed プロパティに (ShowElapsedTime メソッドで行うように) 50 ミリ秒ごとにアクセスできます。
その主な問題は、タイマーが完全に時間を計っていないことと、ラベルのテキストの更新が不安定になることです。
別のアプローチとして、スレッドを使用して UI がロックダウンするのを防ぎますが、メイン スレッド以外のスレッドからラベル テキストを変更すると、例外が発生します。
その例外をバイパスすることはできますが、より良い方法は BackgroundWorker を使用することです。
BGWorker は別のスレッドでタスクを実行し、進行状況を報告してメイン スレッドで呼び出すことができます。
本当に完璧にしたい場合は、プロパティ ElapsedTime を持つ INotifyPropertyChanged を実装するクラスと、プライベートな StopWatch データ メンバーを用意してください。このクラスは、次の方法で BackgroundWorker を使用します。
担当者:
this._stopwatch = new Stopwatch();
this._worker = new BackgroundWorker {WorkerReportsProgress = true, WorkerSupportsCancellation = true};
_worker.DoWork += (s, e) =>
{
while (!_worker.CancellationPending)
{
_worker.ReportProgress(0, watch.Elapsed);
Thread.Sleep(1);
}
};
_worker.ProgressChanged += (s, e) =>
{
this.ElapsedTime = (TimeSpan)e.UserState;
};
ワーカーを開始する場合 (タイマーを開始する場合):
stopwatch.Start();
_worker.RunWorkerAsync();
ワーカーを停止したい場合 (タイマーを停止する場合):
stopwatch.Reset();
_worker.CancelAsync();
クラス自体には、ワーカー (データ メンバー) と対話する Start メソッドと Stop メソッドがあります。
最後に、ラベル テキストをクラスの ElapsedTime プロパティにバインドできます。または、ShowElapsedTime メソッドを使用して ElapsedTimeChanged イベントをサブスクライブします。ただし、stopWatch.Elapsed プロパティの代わりにクラスの ElapsedTime プロパティを使用します。