我有一个可以包含1-10条记录的循环....
在我循环的那个循环中:
ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
new Thread(processTaskThread).Start();
我的问题是:这是否有效,或者我是否需要编写代码,以便使用唯一变量名声明线程?
答案 0 :(得分:8)
您无需为其指定唯一名称。你做需要确保它们在完成后得到清理,而你做需要确保如果有什么变化可以发送10,000条记录,而不是只发送10条记录不要尝试创建10,000个线程。一种方法是通过QueueUserWorkItem()函数。
答案 1 :(得分: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();
}
}
}