2013-03-07 14 views
0

這是代碼:我應該如何報告以報告背景工作者DoWork活動的進展情況?

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      BackgroundWorker worker = sender as BackgroundWorker; 
      while (true) 
      { 

       if ((worker.CancellationPending == true)) 
       { 
        e.Cancel = true; 
        break; 
       } 
       else 
       { 
        if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value) 
        { 
         soundPlay = true; 
         blinking_label(); 
         NudgeMe(); 
        } 
        else 
        { 
         soundPlay = false; 
         stop_alarm = true; 

        } 
        backgroundWorker1.ReportProgress(
       } 
      } 
     } 

我應該怎麼放,或使用此:?backgroundWorker1.ReportProgress( 我沒有任何進展酒吧或一些我應該怎麼辦呢

在此之前,DoWork的事件是像這樣:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      BackgroundWorker worker = sender as BackgroundWorker; 
      while (true) 
      { 

       if ((worker.CancellationPending == true)) 
       { 
        e.Cancel = true; 
        break; 
       } 
       else 
       { 
        if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value) 
        { 
         soundPlay = true; 
         blinking_label(); 
         NudgeMe(); 
        } 
        else 
        { 
         soundPlay = false; 
         stop_alarm = true; 

        } 
        cpuView(); 
        gpuView(); 
        //Thread.Sleep(1000); 
       } 
      } 
     } 

凡內cpuView()我有:

this.Invoke(new Action(() => 
           { 
            data = new List<string>(); 
            data.Add("Gpu Temeprature --- " + sensor.Value.ToString()); 
            listBox1.DataSource = null; 
            listBox1.DataSource = data; 
            listBox1.Invalidate(); 
           })); 

所以我認爲正確的方法是使用progrees報告並在進度報告事件中使用此listBox更新。而不是在DoWork事件中調用cpuView和gpuView。

回答

2
blinking_label(); 

您不能使背景工作人員的標籤閃爍。因此,使用ReportProgress()來運行閃爍標籤的代碼是一個好主意。該方法不僅用於報告進度,還具有在UI線程上運行代碼的通用功能。

你確實需要做一些事情來避免眨眼和反覆推敲,例如睡覺一段時間。您不能將Sleep()呼叫留下評論。此代碼是定時器的Elapsed事件處理程序而非工作程序的非常強大的候選者。這也將確保您使用用於更有效地運行此代碼的線程池線程。然後使用Control.BeginInvoke()在UI線程上運行代碼。

此外,由於獲取CPU溫度應該非常便宜,你很可能根本就不需要線程池線程。它允許使用常規的WinForms Timer,現在一切都變得簡單。

+0

漢斯那麼解決它的更好的方法是使用一個簡單的定時器?然後我會這樣做。 – user2065612 2013-03-07 23:07:38

+0

我將會刪除backgroundworker,而只是使用一個簡單的計時器吧? – user2065612 2013-03-07 23:07:59