C# Parallel.ForEach在合并datatable c时花费太多时间#

C# Parallel.ForEach在合并datatable c时花费太多时间#,c#,.net,c#-4.0,C#,.net,C# 4.0,我想在并行foreach循环中将一个DataTable追加到另一个DataTable。我正在使用Merge追加datatable。当我使用合并或不使用合并时,它花费了太多的时间,完成得太快了 ReportService _rs = new ReportService(); DataTable dtMain = new DataTable(); Parallel.ForEach(brandCode, SICode => { dtMa

我想在并行foreach循环中将一个DataTable追加到另一个DataTable。我正在使用Merge追加datatable。当我使用合并或不使用合并时,它花费了太多的时间,完成得太快了

ReportService _rs = new ReportService();

DataTable dtMain = new DataTable();

 Parallel.ForEach(brandCode, SICode =>            
  {      

      dtMain.Merge(_rs.myFunctionReturnDataTable(SICode));//this takes too much time

      //_rs.myFunctionReturnDataTable(SICode);this does not take time

  });

基于for Merge,我感觉到一个计算密集型的diff正在发生,而您的代码很慢,因为这占用了您所有的时间。DataTable对于读取来说是线程安全的,但对于写入来说不是,所以可能也发生了一些“坏”事情(这可能会让您的速度变慢)。无论如何,我的建议是将myFunctionReturnDataTable的所有结果放在ConcurrentBag中,然后进行合并。以后可能会有一些策略性的合并方法,但我会在每个返回的数据表上进行循环合并作为基准,看看它能让您走多远。

您锁定了吗?合并不是线程安全的。您是否尝试过将行添加到dtMain的末尾?在当前状态下,代码的缺陷超出了性能。或者实际代码看起来不同吗?不,我没有锁定。我不知道如何在dtMain的末尾添加行,并给出一些示例代码。这是实际代码。
DataTable
方法不是线程安全的。你不能这样做。当你使用TPL时,你在做多线程。你必须知道怎么做。我建议您在单个线程中完成任务。如果合并是瓶颈,您的方法将无法解决任何问题。在单个线程中,性能问题并没有变得更好。在我看来,有两个瓶颈,一个是myFunctionReturnDataTable的并行化,另一个是Merge的紧急瓶颈。正如我所指出的,Merge不是线程安全的,我的建议是将它移出当前的循环,这样可以理清这两个瓶颈。如果唯一的问题是合并速度慢,那么就没有高抽象度的答案(尽管可能有基于返回数据表的合理策略)。我们知道情况更复杂,因为合并不是线程安全的。