C# 导致错误结果的并行任务
为什么任务列表会产生错误的结果。 谁能指点方向 到目前为止,这是我的代码C# 导致错误结果的并行任务,c#,parallel-processing,C#,Parallel Processing,为什么任务列表会产生错误的结果。 谁能指点方向 到目前为止,这是我的代码 static string[] kk = new string[] { "a", "b", "c", "d", "e", "f" }; static void Main(string[] args) { //Parallel.For(0, 10, i => Test(i)); //Console.ReadLine(); foreach(string str
static string[] kk = new string[] { "a", "b", "c", "d", "e", "f" };
static void Main(string[] args)
{
//Parallel.For(0, 10, i => Test(i));
//Console.ReadLine();
foreach(string str in kk)
{
Task<string> task = Task.Factory.StartNew(() => Test(str));
listTask.Add(task);
}
do
{
Thread.Sleep(100);
}while(!Task.WaitAll(listTask.ToArray(),1000));
foreach (Task<string> task in listTask)
{
Console.WriteLine(task.Status.ToString() + " : " + task.Result);
}
Console.ReadLine();
}
private static string Test(string i)
{
return "test " + i;
}
静态字符串[]kk=新字符串[]{“a”、“b”、“c”、“d”、“e”、“f”};
静态void Main(字符串[]参数)
{
//对于(0,10,i=>Test(i));
//Console.ReadLine();
foreach(kk中的字符串str)
{
Task Task=Task.Factory.StartNew(()=>Test(str));
添加(任务);
}
做
{
睡眠(100);
}而(!Task.WaitAll(listTask.ToArray(),1000));
foreach(listTask中的任务)
{
Console.WriteLine(task.Status.ToString()+“:”+task.Result);
}
Console.ReadLine();
}
私有静态字符串测试(字符串i)
{
返回“测试”+i;
}
我期待这样的结果:
测试a
测试b
测试c
测试d
测试e
测试f
但我上面的代码是这样的:
测试f
测试f
测试f
测试f
测试f
测试f
提前感谢。这句话是罪魁祸首:
Task<string> task = Task.Factory.StartNew(() => Test(str));
这将使每个表达式捕获其自己的局部变量
编辑:
这个问题在C#5中得到了解决:
每个
foreach
迭代现在都会得到变量的新副本。感谢@dcastro的指导和解释:)
var localStr = str;
Task<string> task = Task.Factory.StartNew(() => Test(localStr));