2016-09-05 11 views
0

私はbackgroundworkerを使用して、ループ内で重い作業を完了するためにループの計算時間を表示しています。Backgroundworkerを使用してLabel.textが更新されていません

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     Stopwatch StopWatch_Summary = new Stopwatch(); 
     BackgroundWorker xBackgroundWorker = new BackgroundWorker(); 
     Label xLabel = new Label(); 

     public Form1() 
     { 
      InitializeComponent(); 

      xBackgroundWorker.WorkerReportsProgress = true; 
      xBackgroundWorker.DoWork += xbackgroundWorker_DoWork; 
      xBackgroundWorker.ProgressChanged += xbackgroundWorker_ProgressChanged; 
      xLabel.Text = "XXXXXXXXXXXXX"; 

      HeavyComputation(); 
     } 

     private void xbackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      while (true) 
      { 
       xBackgroundWorker.ReportProgress(0); 
       System.Threading.Thread.Sleep(1000); 
       if (!StopWatch_Summary.IsRunning) 
       { 
        break; 
       } 
      } 
     } 
     private void xbackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      TimeSpan timeSpan = StopWatch_Summary.Elapsed; 

      xLabel.Text = String.Format("Time : {0:00}:{1:00} sec", timeSpan.Minutes, timeSpan.Seconds); 
     } 
     private void HeavyComputation() 
     { 
      StopWatch_Summary.Start(); 
      xBackgroundWorker.RunWorkerAsync(); 

      //for(int i=1;i<=MyX;i++) 
      //{ 
      //Heavy Computation that takes 38seconds to compute 
      //} 

      StopWatch_Summary.Stop(); 
     } 
    } 
} 

ラベルが更新されているかどうかを確認するためにxLabel.Text = "XXXXXXXXXXX"を割り当てました。私はループの期間中にラベルが "XXXXXXXXXXX"のままであり、ループが終了するまでただ更新することを知りました。およそ38秒後にxLabel.Text = "時間:00:38秒"。どのように私はこれを修正することができます。その後、

+0

は、あなたは、単に使用して自分で解決することができ、このものではありませんいくつかのブレークポイントと一緒にデバッガ? –

+0

@Set UIスレッドで呼び出される 'ProgressChanged'イベントを正しく使用しているので、重複していません。 –

+0

私は "xbackgroundWorker_ProgressChanged"にブレークポイントを入れようとしましたが、そこに1回しか行きませんでした。 – Vincent

答えて

2
xBackgroundWorker.RunWorkerAsync(); 

すぐに戻り、(それが非同期であるため)労働者が を完了するまで待ちません

StopWatch_Summary.Stop();実行されるため、DoWorkのループは、最初の繰り返し

後、私はそれが(テストされていません)、次のようになります推測終了する:

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     Stopwatch StopWatch_Summary = new Stopwatch(); 
     BackgroundWorker xBackgroundWorker = new BackgroundWorker(); 
     Label xLabel = new Label(); 

     public Form1() 
     { 
      InitializeComponent(); 

      xBackgroundWorker.WorkerReportsProgress = true; 
      xBackgroundWorker.DoWork += xbackgroundWorker_DoWork; 
      xBackgroundWorker.ProgressChanged += xbackgroundWorker_ProgressChanged; 
      xLabel.Text = "XXXXXXXXXXXXX"; 

      StartHeavyComputation(); 
     } 

     private void xbackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      StopWatch_Summary.Start(); 
      xBackgroundWorker.ReportProgress(0); 

      for(int i=1;i<=MyX;i++) 
      { 
       xBackgroundWorker.ReportProgress(i);  
       //Heavy Computation that takes 38seconds to compute 
      } 

      StopWatch_Summary.Stop(); 
     } 

     private void xbackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      TimeSpan timeSpan = StopWatch_Summary.Elapsed; 
      xLabel.Text = String.Format("Time : {0:00}:{1:00} sec", timeSpan.Minutes, timeSpan.Seconds); 
     } 

     private void StartHeavyComputation() 
     { 
      xBackgroundWorker.RunWorkerAsync();  
     } 
    } 
} 
+0

それは正しい答えです、IMHOです。 –

+0

どのように私はそれを修正することができます。私の手続きは正しい順序になっていますよね?ストップウォッチを起動してからrunworkerasyncを実行し、次に計算し、最後にストップウォッチを停止してください。 – Vincent

+0

@Vincent [BackgroundWorker'に関するドキュメントを読む](https://msdn.microsoft.com/en-us/library/cc221403(v=vs) .95).aspx)。基本的に、あなたのコードを 'DoWork'に入れます。ループする必要はありません。 –

関連する問題