2014-09-19 49 views
-1

在DoWork的事件中,我所做的:爲什麼背景工作者永遠無法完成完成的事件?

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      BackgroundWorker bgw = (BackgroundWorker)sender; 
      distance = 0; counter = 0; 
      if (bgw.CancellationPending == true) 
      { 

      } 
      else 
      { 
       while (counter < 200) 
       { 
        counter += 1; 
        distance = (float)counter; 
        DateTime dt1, dt2; 
        dt1 = DateTime.Now; 
        CloudEnteringAlert.cloudalert(localbmp, distance); 
        dt2 = DateTime.Now; 
        TimeSpan ts = dt2 - dt1; 
        Logger.Write(ts.TotalMilliseconds.ToString()); 
        if (counter == 199) 
        { 
         counter = 0; 
         CloudEnteringAlert.ClearList(); 
         //break; 

        } 
        try 
        { 
         if (completed == true) 
         { 
          return; 
         } 
         else 
         { 
          this.Invoke(new Action(() => 
          { 
           if (CloudEnteringAlert.cloudsfound == true) 
           { 
            listBox1.Items.Add("Cloud detected at: " + CloudEnteringAlert.cloudsdistance.Text + " Kilometers from the coast"); 
            timesdetectedclouds += 1; 
            label2.Visible = true; 
            label2.Text = timesdetectedclouds.ToString(); 
           } 
           else 
           { 
            listBox1.Items.Add("Cloud not detected at: " + CloudEnteringAlert.cloudsdistance.Text + " Kilometers from the coast"); 
            timesnotdetectedclouds += 1; 
            label4.Visible = true; 
            label4.Text = timesnotdetectedclouds.ToString(); 
           } 
          })); 
         } 
        } 
        catch (Exception err) 
        { 
         Logger.Write(err.ToString()); 
        } 
       } 
      } 
     } 

而在完成的事件我所做的:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      if ((e.Cancelled == true)) 
      { 

      } 

      else if (!(e.Error == null)) 
      { 

      } 

      else 
      { 
       string t = "Done!"; 
       completed = true; 
      } 

但它永遠無法與IF中完成的事件。

我想要做的一般是在DoWork事件中添加到列表框1的項目只有一次。但它一直在不停地做它。 如果我將使用Break;這裏:

if (counter == 199) 
        { 
         counter = 0; 
         CloudEnteringAlert.ClearList(); 
         //break; 
        } 

它會到達完成的事件並停止。 但我不想停止backgorundworker我只想做與listBox1的部分只有一次,當它達到199不要再繼續添加到listBox1,但繼續做其他事情再次。

+0

ReportProgress將是非常好的...併除此之外,也許你有你的手無限循環...... remenber那個櫃檯和距離是從另一個線程,所以也許是一個競爭條件... – terrybozzio 2014-09-19 21:47:49

回答

0

如果我理解正確的,你想要的backgroundWorker1_DoWork代碼保持運行,但你想要的backgroundWorker1_RunWorkerCompleted事件時DoWork的處理了199項射擊。 「完成」事件意味着DoWork代碼已完成處理,而不是「完成某件事」。我認爲TerryBozzio有一個很好的建議。調用ReportProgress火的ProgressChanged事件的第一時間計數器== 199

+0

codeMethod我想使listBox1.Add部分一次。不管它是否到達完成的事件都不重要,或者我不需要它只做一次listBox1部分。其餘的要不間斷。當計數器== 199我希望它不會再次使listBox1部分,但將繼續做不停的一遍又一遍。問題是如何使listBox1部件一次。我使用了報告進度,它已經完成了事件,但一切都停止了。 – 2014-09-19 22:32:48

+0

在你測試的代碼中if(completed == true)return; ...你可以改成if(completed == true)continue; – codeMethod 2014-09-19 22:55:18