C# 并行任务上的意外输出

C# 并行任务上的意外输出,c#,.net,task,multitasking,C#,.net,Task,Multitasking,我必须并行化现有代码。基本上,代码获取一个文件,对其进行处理,并将结果保存到一个新文件中。我需要在一批文件上做这项工作 因此,我编写这个示例代码是为了查看我需要的代码结构,但它的工作方式很奇怪: 类程序 { 静态void Main(字符串[]参数) { 处理器=空; ProcessAsync(处理器,3); } 静态void ProcessAsync(处理器,int-n) { IList tasks=新列表(); 对于(int i=0;iprocessor.Process()); 任务[i].S

我必须并行化现有代码。基本上,代码获取一个文件,对其进行处理,并将结果保存到一个新文件中。我需要在一批文件上做这项工作

因此,我编写这个示例代码是为了查看我需要的代码结构,但它的工作方式很奇怪:

类程序
{
静态void Main(字符串[]参数)
{
处理器=空;
ProcessAsync(处理器,3);
}
静态void ProcessAsync(处理器,int-n)
{
IList tasks=新列表();
对于(int i=0;iprocessor.Process());
任务[i].Start();
}
对于(int i=0;i
我预计这一产出:

Task 000: Processing...
Task 001: Processing...
Task 002: Processing...
Task 000: Processed!
Task 001: Processed!
Task 002: Processed!
但我有一个结果:

Task 002: Processing...
Task 002: Processing...
Task 002: Processing...
Task 002: Processed!
Task 002: Processed!
Task 002: Processed!

为什么所有
处理器
id
s
002

忽略其他问题,这是一个捕获和更紧密的问题

你可以搜索,因为网上有很多关于它的文章,这就是CLR和lambda的工作方式

解决方法就是创建一个新的局部变量

for (int i = 0; i < n; ++i)
{
    var proc = new Processor(i);
    tasks.Add(new Task(() => proc.Process()));
    tasks[i].Start();
}
for(int i=0;iproc.Process());
任务[i].Start();
}

忽略其他问题,这是一个捕获和关闭问题

你可以搜索,因为网上有很多关于它的文章,这就是CLR和lambda的工作方式

解决方法就是创建一个新的局部变量

for (int i = 0; i < n; ++i)
{
    var proc = new Processor(i);
    tasks.Add(new Task(() => proc.Process()));
    tasks[i].Start();
}
for(int i=0;iproc.Process());
任务[i].Start();
}

快速查看它似乎与可变范围和将范围折叠到lambda中有关

尝试更改循环,使其如下所示:

    for (int i = 0; i < n; ++i)
    {
        tasks.Add(new Task(() => new Processor(i).Process()));
        tasks[i].Start();
    }
for(int i=0;i新处理器(i.Process());
任务[i].Start();
}

另外,如果问处理器是否真的需要是一个类,它难道不是一个简单的方法吗?您传入处理器,然后为每个循环迭代创建一个新的处理器的逻辑有些奇怪。你真的想这么做吗?

快速看,这似乎是与变量作用域和将作用域折叠到lambda有关

尝试更改循环,使其如下所示:

    for (int i = 0; i < n; ++i)
    {
        tasks.Add(new Task(() => new Processor(i).Process()));
        tasks[i].Start();
    }
for(int i=0;i新处理器(i.Process());
任务[i].Start();
}

另外,如果问处理器是否真的需要是一个类,它难道不是一个简单的方法吗?您传入处理器,然后为每个循环迭代创建一个新的处理器的逻辑有些奇怪。你真的想要吗?

这是一个古老的经典,叫做“捕获循环变量”,这是一个古老的经典,叫做“捕获循环变量”