2015-08-09 13 views
4

我正在編寫一個執行特定任務(檢查某些內容)的程序,當我使用後臺工作(多個)時,它們會執行多次。我只希望他們執行一次。C#中的BackgroundWorker運行多次

我有一個按鈕,用下面的代碼:

OpenFileDialog ofd = new OpenFileDialog(); 
    ofd.Filter = "Text Documents|*.txt|All Files|*.*"; 
    ofd.ShowDialog(); 
    string filename = ofd.FileName; 
    SortList(filename); 

排序列表功能,將文件分類成多個列表,我稍後將使用背景工人。

public void SortList(string file) 
     { 
      string[] names = System.IO.File.ReadAllLines(file); 
      int list = 1; 
      for (int i = 0; i < names.Length; i++) 
      { 
       switch (list) 
       { 
        case 1: 
         l1.Add(names[i]); 
         break; 
        case 2: 
         l2.Add(names[i]); 
         break; 
        case 3: 
         l3.Add(names[i]); 
         break; 
        case 4: 
         l4.Add(names[i]); 
         break; 
        case 5: 
         l1.Add(names[i]); 
         list = 1; 
         break; 
       } 
       list++; 
      } 

      backgroundWorker1.RunWorkerAsync(); 
      backgroundWorker2.RunWorkerAsync(); 
      backgroundWorker3.RunWorkerAsync(); 
      backgroundWorker4.RunWorkerAsync(); 
     } 

有這個功能沒有問題,我已經調試它,並且列出了被分裂,因爲他們應該,沒有多餘的線條等問題是後臺工作人員做的工作多次。

我最後的作用是檢查一個,它看起來像這樣:

public void CheckList(List<string> names) 
{ 
    for (int i = 0; i < names.Count(); i++) 
    { 
     try 
     { 
      foreach (string s in names) 
      { 
       uu.parsePage("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", s); 
       string[] r = { uu.followers.ToString(), uu.followingcount, uu.isVerified.ToString() }; 
       listView1.Invoke(new Action(() => listView1.Items.Add(uu.username).SubItems.AddRange(r))); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     } 
    } 

而且每個背景工人有這樣的代碼:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    CheckList(l1); 
} 

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) 
{ 
    CheckList(l2); 
} 

private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e) 
{ 
    CheckList(l3); 
} 

private void backgroundWorker4_DoWork(object sender, DoWorkEventArgs e) 
{ 
    CheckList(l4); 
} 

我做了一些調試和我可以不知道爲什麼背景工作者多次做這項工作。是否有一些衝突或我做錯了什麼?謝謝。

示例文件我用:

danbilzerian 
dailywatch 
fitness 
fitspo 
bodyofrachael 

這5項和後臺工作人員做了一些工作多次,這最終看起來像這樣:

enter image description here

+0

爲什麼在同一列表中存在內部循環時存在外部循環? – user3185569

回答

5

的問題出在CheckList方法。

第一個循環的目的是什麼?

你在第一個循環中循環「名稱」,然後在foreach循環遍歷它。

由於您沒有使用i計數器,因此似乎第一個循環無用。

BackgroundWorker的事件沒有被執行多次的,可以肯定這一點,只是使用在DoWork的事件對他們中的每一個Console.WriteLine("BackGroundWork 1 Started");並檢查輸出在「輸出」窗口。

+0

哇。在這之後我真的覺得很愚蠢。我修復了額外的循環,顯然它工作得很好,沒有後臺工作人員多次進行工作。非常感謝您的支持。只有一個問題,「輸出」窗口到底在哪裏? – user5204184

+1

使用Visual Studio,查看>輸出。您可以在msdn上查看以獲取更多信息和更好的解釋:https://msdn.microsoft.com/en-us/library/3hk6fby3.aspx – user3185569