“的foreach”使用并行任务库时失败 [英] 'foreach' failing when using Parallel Task Library

查看:128
本文介绍了“的foreach”使用并行任务库时失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面code创建文件的正确数目,但是每个文件包含第一列表中的内容。任何人都可以发现我做了什么错了吗?

 私人的IList<列表<字符串>> GetLists()
{
  // code略...
}

私人无效DoSomethingInParallel()
{
  变种列表= GetLists();

  VAR任务=新的名单,其中,任务>();

  VAR厂=新TaskFactory();

  的foreach(列表中的VAR名单)
  {
    tasks.Add(factory.StartNew(()=>
    {
      WriteListToLogFile(名单);
    }));
  }

  Task.WaitAll(tasks.ToArray());
}
 

解决方案

道歉没有回答这点。我找到了解决办法 - 虽然我不明白为什么它的工作原理...

本来,我有这个...

 的foreach(VAR列表中列出)
  {
    tasks.Add(factory.StartNew(()=>
    {
      WriteListToLogFile(名单);
    }));
  }
 

更改顺序的foreach到并行的foreach解决了这个问题...

  Parallel.ForEach<字符串>(列表,列表=>
    tasks.Add(factory.StartNew(()=>
    {
      WriteListToLogFile(名单);
    }));
  );
 

The following code creates the correct number of files, but every file contains the contents of the first list. Can anyone spot what I've done wrong please?

private IList<List<string>> GetLists()
{
  // Code omitted for brevity...
}

private void DoSomethingInParallel()
{
  var lists = GetLists();

  var tasks = new List<Task>();

  var factory = new TaskFactory();

  foreach (var list in lists)
  {
    tasks.Add(factory.StartNew(() =>
    {
      WriteListToLogFile(list);
    }));
  }

  Task.WaitAll(tasks.ToArray());
}

解决方案

Apologies for not replying to this earlier. I found a solution - although I don't understand why it works...

Originally, I had this ...

foreach (var list in lists)
  {
    tasks.Add(factory.StartNew(() =>
    {
      WriteListToLogFile(list);
    }));
  }

Changing the sequential foreach to a parallel foreach fixes the problem...

Parallel.ForEach<string>(lists, list =>
    tasks.Add(factory.StartNew(() =>
    {
      WriteListToLogFile(list);
    }));
  );

这篇关于“的foreach”使用并行任务库时失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆