2016-10-15 34 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