2013-03-07 13 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