2013-01-12 22 views
0

我在讀取字符串列表時遇到問題,下面是我的代碼。無法讀取列表中寫入的元素作爲BackgroundWorker

public partial class form : Form 
{ 
    public static List<String> errores = new List<String>(); 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){ 

     BackgroundWorker bw = sender as BackgroundWorker; 

     // Extract the argument. 
     string arg = (string)e.Argument; 

     // Start the time-consuming operation. 
     // e.Result = 
     if (tags.prog2(arg) == false) 
     { 
      //guardar en lista de no completadas 
      form.errores.Add("a"); 

     } 
    //some code here 
     } 




    private void buscar() 
    { 

    //Some code here 
     foreach (string i in rutas) 
      { 
       backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); 

       backgroundWorker1.WorkerSupportsCancellation = true; 
       backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); 
       backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); 
       backgroundWorker1.RunWorkerAsync(i);      


      } 
      foreach (string prime in form.errores) 
      { 
       MessageBox.Show(prime); 
      } 
    } 
} 

但在列表中沒有元素,爲什麼會發生這種情況?

很顯然,我叫兩個功能

Aclaration FUNCTION1其BackgroundWorker的,所以它叫過很多次,我不知道這是關係到錯誤。

+6

你叫'功能1()'第一? –

+0

是的,我打電話給他們。 –

+4

提供您用於調用這兩個函數的代碼。 – oxilumin

回答

1

Aclaration FUNCTION1其BackgroundWorker的,所以它叫過很多次,我不知道這是關係到錯誤

似乎read()之前function1()電話叫。由於函數1被BackgroundWorker調用,所以很有可能。

您應該保留一個標誌來指示是否調用function1。如果不叫,你應該採取預防措施。

對於參考,下面的代碼運行良好(和生產"aaa"輸出)

form f = new form(); 
f.Test(); 

public partial class form 
{ 
    public static List<String> errores = new List<String>(); 

    private void function1() 
    { 
     form.errores.Add("aaa"); 
    } 

    //Now I try to read it in other function. 

    private void read() 
    { 
     foreach (string i in form.errores) 
     { 
      Console.WriteLine(i); 
     } 
    } 

    public void Test() 
    { 
     function1(); 
     read(); 
    } 
} 
+0

好吧,那是錯誤,我把一個Thread.Sleep(),它的工作原理,有沒有辦法知道所有的後臺工作人員已經完成? –

+0

@Gonzalo Hernandez,'backgroundWorker1_RunWorkerCompleted'將在'backgroundWorker1'完成工作時調用。 –

+0

'BackgroundWorker.RunWorkerCompletedEvent'告訴它已完成。 'BackgroundWorker.IsBusy'告訴它忙。 – Tilak