にタイマーを使用して:、今更新UIごとに1秒私は自分のアプリケーションで次のコードを持つC#の
Task.Factory.StartNew(() =>
{
progressReporter.ReportProgress(() =>
{
stopWatch.Start();
lblStatus.Text = "We've begun!";
});
int c = 0;
DateTime starttime = DateTime.Now;
foreach (string file in fileList)
{
c++;
csvCreator.createCSV(file);
progressReporter.ReportProgress(() =>
{
//Estimated time remaining
if (c % 100 == 0)
{
TimeSpan timespent = DateTime.Now - starttime;
int secondsremaining = (int)(timespent.TotalSeconds/c * (total - c));
TimeSpan t = TimeSpan.FromSeconds(secondsremaining);
lblTimeRemaining.Text = string.Format("{0:D2}h:{1:D2}m:{2:D2}s",
t.Hours,
t.Minutes,
t.Seconds,
t.Milliseconds);
}
//Progress bar
int percentComplete = (c * 100/total);
if ((int)percentComplete <= progressBar.Maximum)
{
progressBar.Value = (int)percentComplete;
}
}
});
}
すべての100回目の反復のための私のコードのチェックをし、UIを更新します。私はより良いユーザーエクスペリエンスを提供するために毎秒チェックすることを好むでしょう。
私はこれをどうやって行うのですか?
を使用することができます。あなたはすでに解決策を知っています。しかし、あなたの本当の問題はおそらく、あなたがメインスレッドで時間のかかる作業をしていることでしょう。バックグラウンドスレッドでその必要があり、UIの更新はUIスレッドに呼び出される必要があります。 –
ありがとうございます。私は、既存のコードのコンテキストでTimerオブジェクトを使用して特定の実装を探しています。 createCSVはプロセッサを大量に使用するタスクですが、実際にはバックグラウンドスレッドで実行されており、ProgressReporterクラスを使用すると、UIスレッドにアクセスしてUIを更新し、すばらしいものと新しいものを維持できます。 –
タイマーを作成し、そのプロパティを設定し、イベントハンドラを追加すればいいです。それがすべてです。 –