2012-08-12 55 views
0
//static int var1, var2, var3; 
//static List<string> list; 

    public static void MyMethod(Object obj, int times) 
    { 
     List = doc1.Descendants("Order") 
      .Select(d => d.Value) 
      .ToList(); 
     for (int i = 0; i < List.Count; i++) 
     { 
      try 
      { 
       var item = (from m in doc1.Elements("list").Elements("Order") 
           where m.Value == List[i] 
           select m); 

       item.Remove(); 

       doc1.Save(path1); 
       var1 = doc1.Root.Descendants("Order").Count(); 


       //DoSomethingHeavy with List[i] 

       doc2.Element("list2").Add(new XElement("Order", List[i])); 
       doc2.Save(path2); 


       var2= doc2.Root.Descendants("Order").Count(); 

      } 
      catch (Exception) 
      { 
       doc3.Element("list3").Add(new XElement("Order", List[i])); 
       doc3.Save(path3); 

       var3 = doc3.Root.Descendants("Order").Count(); 

      } 
     } 
    } 

這是一個公共靜態類中的MyMethod。 我想使其在BackgroundWorker下的表單中運行,以便能夠暫停和恢復執行。BackgrounderWorker在try-catch塊中停止

我使用這個類:

public class BackgroundLoading 
{ 
    public BackgroundWorker Bw; 
    public delegate void RunFunction(); 
    public RunFunction thisFunction; 



    public BackgroundLoading(RunFunction newFunction) 
    { 
     thisFunction = newFunction; 
     Bw = new BackgroundWorker(); 
     Bw.DoWork += new DoWorkEventHandler(Bw_DoWork); 
     Bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Bw_RunWorkerCompleted); 
    } 

    public void Start() 
    { 
     Bw.RunWorkerAsync(); 
    } 

    void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      //an error occured 
      MessageBox.Show("an error occured: " + e.Error.Message); 
     } 
     if (e.Cancelled) 
     { 
      //an error occured 
      MessageBox.Show("Job cancelled"); 
     } 
     else 
     { 
      MessageBox.Show("Job completed"); 
     } 

    } 

    void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     MessageBox.Show(" *"); 
    } 

    void Bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (thisFunction != null) 
      thisFunction(); 
    } 
} 

//class to implement 

然後,在myForm會:

private void button1_Click(object sender, EventArgs e) 
    { 
     BackgroundLoading bl = new BackgroundLoading(MyMethod()); 
     bl.Start(); 
    } 

我真的很新的BackgroundWorker,可能我不使用它的正確方法。 單擊StopExecution按鈕時,並非我的所有文檔(doc1,doc2,doc3)都已保存。 那麼,如何避免在try - catch塊中停止?

+0

你如何處理*停止*執行請求? – Tigran 2012-08-12 09:45:22

+0

這種方式private void btnStop_Click(object sender,EventArgs e) if(backgroundWorker.WorkerSupportsCancellation == true) { {0} backgroundWorker.CancelAsync(); } } – Barbara 2012-08-12 09:51:19

+1

Bgw不適合暫停/恢復。取消需要將一個標誌暴露給'MyMethod()'。 – 2012-08-12 10:03:29

回答

1
  1. WorkerSupportsCancellation設置爲True以允許您的BackgroundWorker支持取消。
  2. 使您的取消按鈕調用CancelAsync()方法。
  3. 改變你的方法分爲2種方法。一個應該得到一個項目編號,另一個將逐項工作。
  4. 在您的DoWork()方法中,請檢查是否存在cancellation pending,如果有,則結束您的過程。

    void Bw_DoWork(object sender, DoWorkEventArgs e) 
        { 
    
        //in your loop test every time Cancel flag  
        for (int i = 0; i < MyMethodGetItemcount(); i++) 
        { 
         MyMethod(i);//item by item 
         if(yourbackgroundworker.CancellationPending) 
         { 
          e.Cancel = true; 
          return; 
         } 
    } 
    
+0

明顯...因爲你告訴我!我會嘗試。謝謝哈桑。 – Barbara 2012-08-13 07:04:15

+0

高興地幫助你;-) – 2012-08-13 10:00:33