繁体   English   中英

使用Parallel.ForEach时出错

[英]Errors in using Parallel.ForEach

本来,我是用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个项)和foreach(项.a中的金额),则代码可以正常工作。

我是否错过了Parallel.ForEach方法的东西?

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

如果您只使用常规的foreach ,那就可以了。

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

一次也只能有一个线程写入一个文件,因此大概是您在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对于内存性能很重要

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM