2009-07-28 49 views
1

我有一個循環,可以包含1-10記錄....很想知道線程理論

在該循環我打電話:

ThreadStart processTaskThread = delegate { ProcessTasks(myParam); }; 
new Thread(processTaskThread).Start(); 

我的問題是:將這項工作,或做我以某種方式需要編寫代碼,以便使用唯一變量名稱來聲明線程?

回答

8

你不需要給他們唯一的名字。你需要確保它們完成時被清理,而你需要確保如果有東西發生變化,你發送10,000條記錄,而不是10條,你不會嘗試創建10,000個線程。一種辦法是通過QueueUserWorkItem()函數。

+3

當他們完成時,你不需要清理線程 - 至少除非你特別要做某些需要清理的東西。 – 2009-07-28 18:48:50

+0

我會研究使用隊列來代替,謝謝 – 2009-07-28 19:36:06

5

你沒有顯示循環,這是至關重要。例如,這被打破:

foreach (Foo myParam in parameters) 
{ 
    ThreadStart processTaskThread = delegate { ProcessTasks(myParam); }; 
    new Thread(processTaskThread).Start(); 
} 

但是,這是好的:破:

foreach (Foo myParam in parameters) 
{ 
    Foo copy = myParam; // This line is crucial 

    // Then we use the new variable in the anonymous method 
    ThreadStart processTaskThread = delegate { ProcessTasks(copy); }; 
    new Thread(processTaskThread).Start(); 
} 

在第一個版本中,myParam變量被捕獲,而且也只有一個變量。在第二個版本中,循環的每次迭代都有一個新的「實例」變量。請參閱我的article on closures瞭解更多信息。

請注意,這不需要線程來演示問題。這是一個沒有使用任何線程的例子:

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     List<Action> actions = new List<Action>(); 
     for (int i=0; i < 10; i++) 
     { 
      actions.Add(delegate { Console.WriteLine(i); }); 
     } 

     foreach (Action action in actions) 
     { 
      action(); 
     } 
    } 
} 

打印「10」十次。這裏是固定版本:

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     List<Action> actions = new List<Action>(); 
     for (int i=0; i < 10; i++) 
     { 
      int copy = i; 
      actions.Add(delegate { Console.WriteLine(copy); }); 
     } 

     foreach (Action action in actions) 
     { 
      action(); 
     } 
    } 
}