【问题标题】:Errors in using Parallel.ForEach使用 Parallel.ForEach 的错误
【发布时间】:2012-11-18 11:08:40
【问题描述】:

最初,我使用 foreach 来完成我的任务。 但是,我想提高任务的效率。 所以,我想使用 Parallel.ForEach 来完成我的任务。

但是,出现错误“未将对象引用设置为实例”。发生了。

这是我的代码:

System.Threading.Tasks.Parallel.ForEach(items, item =>
        {
             System.Threading.Tasks.Parallel.ForEach(item.a, amount =>
                    {
                         WriteToCsv(file, amount.columna, count);
                          count++;
                     });

         });

如果我使用 foreach(var item in items) 和 foreach(amount in item.a),代码可以正常工作。

我是否错过了 Parallel.ForEach 方法的某些内容?

【问题讨论】:

  • 你得到的堆栈跟踪是什么?我相信问题出在 WriteToCsv 内部。您确定可以使用多线程方法写入同一个文件吗?

标签: c# linq parallel.foreach


【解决方案1】:

您不应该嵌套多个并行 Foreach 循环,内部循环基本上是从外部并行循环中窃取资源,这在提高性能方面做得更好。..

一次也只有 1 个线程可以写入文件,因此您在 WriteToCsv() 中使用的任何函数都可能在写入数据之前将所有内容恢复到单个线程中。

加快速度的一种方法是在并行循环中构造要附加到 CSV 文件中的文本,然后使用单个写入操作将其添加到其中:

var sb = new StringBuilder("");
System.Threading.Tasks.Parallel.ForEach(items, item =>
{
     foreach( var amount in item.a )
     {
         sb.append( GetCsvText(file, amount.columna, count) );
         count++;
     };
});

WriteToCsv( sb.ToString() );

显然,您无法控制将订单文本放入 CSV 文件中,因为这只是此代码中线程之间的竞争,我认为这没问题,尽管您的示例代码也是如此。

注意:在循环中构造字符串时,使用 StringBuilder 对内存性能很重要

HTH

【讨论】:

  • StringBuilder.Append 不是线程安全的,因为它不是静态方法...至少根据 msdn Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe. msdn reference
  • @CoffeeMuncher:你说的很对!这个原则仍然成立,但那段代码太可怕了……谁写的?
  • 可以通过在 LocalInit 函数中创建 Stringbuilder 并将其与 Parallel.Foreach 方法的 LocalFinally 参数中的本地字符串连接来同步 Stringbuilder。虽然上面没有显示
【解决方案2】:

为什么要并行执行此操作?您正在将值附加到文件中,这是一个串行(即非并行)过程。

如果你只是使用普通的foreach,你会没事的。

【讨论】:

  • 因为数据库中有很多数据,我想加快进程。如果不能使用Parallel.ForEach,有没有提高效率的方法?
  • 如果必须写入 CSV 文件,则无法并行化。 CSV 文件是连续的。因此,使这更快的唯一方法是减少每条记录所花费的时间。如果您只是将数据写入文件,您可能无法加快速度。
  • 我使用 LINQ 从数据库中选择记录并将它们写入 CSV 文件。所以,我没有办法加快程序,对吧?
  • 你没有发布你的代码,所以很难说。但是几乎没有什么比使用 LINQ 读取数据更简单的了(尤其是当您最后添加一个 .ToList() 时)然后将该数据写入文本文件......因此,您将如何加快速度?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多