2011-09-14 3 views
0

にタイマーを使用して:、今更新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を更新します。私はより良いユーザーエクスペリエンスを提供するために毎秒チェックすることを好むでしょう。

私はこれをどうやって行うのですか?

+4

を使用することができます。あなたはすでに解決策を知っています。しかし、あなたの本当の問題はおそらく、あなたがメインスレッドで時間のかかる作業をしていることでしょう。バックグラウンドスレッドでその必要があり、UIの更新はUIスレッドに呼び出される必要があります。 –

+0

ありがとうございます。私は、既存のコードのコンテキストでTimerオブジェクトを使用して特定の実装を探しています。 createCSVはプロセッサを大量に使用するタスクですが、実際にはバックグラウンドスレッドで実行されており、ProgressReporterクラスを使用すると、UIスレッドにアクセスしてUIを更新し、すばらしいものと新しいものを維持できます。 –

+0

タイマーを作成し、そのプロパティを設定し、イベントハンドラを追加すればいいです。それがすべてです。 –

答えて

2

あなたはそれがダニたびに1秒の間隔でタイマーを作成し、UIを更新timerオブジェクト

0

if (c%100==0)の代わりに、stopWatchを参照してください:1秒に達しましたか? yes-> update uiの場合

もちろん、各UIの更新後にstopWatchをリセットしてください。

しかし、UIを更新するには、メッセージループが実行されている必要があることに注意してください。 UIスレッドがファイル処理ループに詰まっていると、UIが正しく更新されません。

関連する問題