我有一个10000行的数据表,我使用foreach循环到数据表获取每一行,每行我调用一个需要2秒执行的函数,而对于10000行,总时间是20000秒,怎么能我使用多线程来提高性能。这是我的代码
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 :(得分:4)
最简单的解决方案可能是使用Parallel.ForEach。
或者,您可以手动将工作交给线程池(例如,通过Task.Run()
),并在最后等待所有结果。
请注意,AddAttendace
函数对于这些优化必须是线程安全的。
答案 1 :(得分:3)
您可以使用Parallel.Foreach,这将使用ThreadPool线程以并行方式执行您的foreach循环:
Parallel.Foreach(AttCollection,
ac => AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value));
请注意,您需要确保AddAttendace方法是线程安全的,因为您将从多个线程访问它,并且您不希望创建任何竞争条件。
您应该知道Parallel.Foreach不保证将有多少线程用于操作(如果它将是1或更多)但您可以使用ParallelOptions Class和{{3}来限制操作的线程数}}:
Parallel.Foreach(AttCollection, new ParallelOptions() { MaxDegreeOfParallelism = 3 },
ac => AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value));
答案 2 :(得分:1)
尝试使用Parallel.ForEach并将当前方法包装在Task中。