我有一個循環,可以包含1-10記錄....很想知道線程理論
在該循環我打電話:
ThreadStart processTaskThread = delegate { ProcessTasks(myParam); };
new Thread(processTaskThread).Start();
我的問題是:將這項工作,或做我以某種方式需要編寫代碼,以便使用唯一變量名稱來聲明線程?
我有一個循環,可以包含1-10記錄....很想知道線程理論
在該循環我打電話:
ThreadStart processTaskThread = delegate { ProcessTasks(myParam); };
new Thread(processTaskThread).Start();
我的問題是:將這項工作,或做我以某種方式需要編寫代碼,以便使用唯一變量名稱來聲明線程?
你不需要給他們唯一的名字。你做需要確保它們完成時被清理,而你做需要確保如果有東西發生變化,你發送10,000條記錄,而不是10條,你不會嘗試創建10,000個線程。一種辦法是通過QueueUserWorkItem()函數。
你沒有顯示循環,這是至關重要。例如,這被打破:
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();
}
}
}
當他們完成時,你不需要清理線程 - 至少除非你特別要做某些需要清理的東西。 – 2009-07-28 18:48:50
我會研究使用隊列來代替,謝謝 – 2009-07-28 19:36:06