2016-10-15 32 views
2

我有一個數據表有10000行,我使用foreach循環到數據表來獲取每一行,併爲每行調用一個函數,需要2秒執行,併爲10000行總時間是20000秒,我怎樣才能使用多線程來提高性能。這裏是我的代碼如何在C#中的forech循環中使用多線程#

DataTable AttCollection = getRecord(); // 10000 records 
foreach (var ac in AttCollection) 
      { 
       AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value); 
      } 


public bool AddAttendace(int? branchID, V_HR_EmployeePlacementDetailed emp, DateTime dt) 
     { 
      //code... 
     } 
+0

您可以通過創建字典來查找性能,而不是逐行列舉查找。您的平均搜索時間爲N/2,而字典將爲Log2(N)。 – jdweng

回答

4

最簡單的解決方案可能是使用Parallel.ForEach。 或者,您可以手動將工作交給線程池(例如,通過Task.Run()),並在最後等待所有結果。

請注意,您的AddAttendace函數對於這些優化必須是線程安全的。

3

您可以使用Parallel.Foreach,這將使用線程池線程以並行方式執行您的foreach循環:

Parallel.Foreach(AttCollection, 
        ac => AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value)); 

請注意,您將需要確保AddAttendace方法是線程安全的,因爲你會從多個訪問線程,你不想創建任何競爭條件。

你應該知道,Parallel.Foreach並不能保證有多少線程將被用於操作(這是否是1或更多),但你可以限制使用ParallelOptions Class運行的線程數量,這overload

Parallel.Foreach(AttCollection, new ParallelOptions() { MaxDegreeOfParallelism = 3 }, 
        ac => AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value)); 
+0

如果AddAttendace方法不是線程安全的比我應該做什麼? –

+2

如果它不是線程安全的,則不應該在多線程環境中使用它,您應該將其更改爲線程安全或根本不使用多線程。 – YuvShap

+0

我不知道羯羊AddAttendace方法是在安全線或沒有,我用Parallel.ForEach作爲 Parallel.ForEach(AttCollection,AC => { AddAttendace(branchID,_ep.Get_V(ac.Key,真實,空),ac.Value); }); –

1

嘗試使用Parallel.ForEach並將當前方法包裝到任務中。

+0

爲什麼?這不比沒有「爲什麼」的評論更好。 – Enigmativity