Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导致错误结果的并行任务_C#_Parallel Processing - Fatal编程技术网

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));