0

最初,我正在使用 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 方法的某些内容?

4

2 回答 2

8

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

如果你只使用一个常规的foreach,你会没事的。

于 2012-11-30T08:56:45.283 回答
0

您不应该嵌套多个 Parallel 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 对内存性能很重要

高温高压

于 2012-12-12T10:26:26.360 回答