2017-03-04 79 views
0

我想在一個並行foreach循環中將一個DataTable附加到另一個DataTable。我正在使用合併來追加數據表。當我使用合併或沒有合併時,它花費太多時間來完成如此之快。Parallel.ForEach在合併數據表時需要太多時間c#

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 

    }); 
+0

你鎖定了嗎?合併不是線程安全的。你有沒有嘗試將行添加到dtMain的末尾?在目前的狀態下,代碼在性能上存在缺陷。或者實際的代碼看起來不同? – Sefe

+0

不,我沒有鎖定。我沒有得到如何添加行到dtMain結束給一些示例代碼。這是實際的代碼。 – satyender

+0

'DataTable'方法不是線程安全的。你不能這樣做。 – Enigmativity

回答

0

基礎上MSDN用於合併,我得到一個計算密集型差異正在發生的事情的感覺和你的代碼是緩慢的,因爲這是佔用了所有的時間。 DataTable對於閱讀而言是線程安全的,但不能用於寫入,所以也許會發生一些「不好的」事情(這可能會讓你變得很慢)。無論哪種方式,我的建議是將myFunctionReturnDataTable的所有結果放入一個ConcurrentBag中,然後再進行合併。之後可能會有策略性的方式來進行合併,但是我會在每個返回的DataTables的循環中對合並進行基準測試,並查看它到底有多遠。

+0

如果合併是瓶頸,你的方法不會解決任何問題。性能問題在單個線程中效果不佳。 – Sefe

+0

在我看來,有兩個瓶頸,一個證明myFunctionReturnDataTable並行化和Merge出現的瓶頸。正如我指出的那樣,Merge不是線程安全的,我的建議是將它從當前循環中移出,這有助於解決這兩個瓶頸問題。如果唯一的問題是合併速度慢,那麼沒有很高的抽象答案(儘管可能存在基於返回的數據表的合理策略)。我們知道情況比較複雜,但由於合併不是線程安全的。 –