我有一个可以包含1-10条记录的循环....
在我循环的那个循环中:
ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
new Thread(processTaskThread).Start();
Run Code Online (Sandbox Code Playgroud)
我的问题是:这会工作,还是我需要编写代码,以便使用唯一的变量名声明线程?
您不需要为它们指定唯一的名称.你确实需要确保它们在完成时被清理干净,你确实需要确保如果有什么变化可以发送10,000个记录而不是10个你不会尝试创建10,000个线程的记录.一种方法是通过QueueUserWorkItem()函数.
你没有展示循环,这是至关重要的.例如,这是破碎的:
foreach (Foo myParam in parameters)
{
ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
new Thread(processTaskThread).Start();
}
Run Code Online (Sandbox Code Playgroud)
但这没关系:破碎:
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();
}
Run Code Online (Sandbox Code Playgroud)
在第一个版本中,myParam正在捕获变量,并且只有一个变量.在第二个版本中,循环的每次迭代都有一个新的变量"实例".有关更多信息,请参阅我关于闭包的文章.
请注意,这不需要线程来演示该问题.这是一个不使用任何线程的示例:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印"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();
}
}
}
Run Code Online (Sandbox Code Playgroud)