如何在C#中的foreach循环中使用多线程

时间:2016-10-15 09:30:47

标签: c# multithreading foreach

我有一个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...
        }

3 个答案:

答案 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中。