【问题标题】:Unexpected output on parallel tasks [duplicate]并行任务的意外输出[重复]
【发布时间】:2018-11-14 20:30:51
【问题描述】:

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

所以,我做了这个示例代码来查看我需要什么代码结构,但它的工作方式很奇怪:

class Program
{
    static void Main(string[] args)
    {
        Processor processor = null;
        ProcessAsync(processor, 3);
    }

    static void ProcessAsync(Processor processor, int n)
    {
        IList<Task> tasks = new List<Task>();

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

        for (int i = 0; i < n; ++i)
        {
            tasks[i].Wait();
        }
    }
}

class Processor
{
    private readonly int id;

    public Processor(int id)
    {
        this.id = id;
    }

    public void Process()
    {
        Console.WriteLine(id.ToString("000") + ": " + "Processing...");
        Thread.Sleep(1000);
        Console.WriteLine(id.ToString("000") + ": " + "Processed!");
    }
}

我期望这个输出:

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!

为什么processorids都是002

【问题讨论】:

标签: c# .net task multitasking


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    试着改变你的循环,让它变成这样:

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2013-07-07
      • 2021-10-20
      • 2015-08-31
      相关资源
      最近更新 更多