Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中的foreach循环中使用多线程#_C#_Multithreading_Foreach - Fatal编程技术网

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

C# 如何在C中的foreach循环中使用多线程#,c#,multithreading,foreach,C#,Multithreading,Foreach,我有一个datatable,它有10000行,我使用foreach循环到datatable来获取每一行,对于每一行,我调用一个需要2秒执行的函数,对于10000行,总时间是20000秒,我如何使用多线程来提高性能。这是我的密码 DataTable AttCollection = getRecord(); // 10000 records foreach (var ac in AttCollection) { AddAttendace(br

我有一个datatable,它有10000行,我使用foreach循环到datatable来获取每一行,对于每一行,我调用一个需要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...
        }

最简单的解决方案可能是使用。 或者,您可以手动将工作交给线程池(例如,通过
Task.Run()
)并等待最后的所有结果

请注意,对于这些优化,您的
AddAttendace
函数必须是线程安全的。

您可以使用,这将使用线程池线程以并行方式执行foreach循环:

Parallel.Foreach(AttCollection, 
                    ac => AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value));
请注意,您需要确保AddAttendace方法是线程安全的,因为您将从多个线程访问它,并且不希望创建任何竞争条件。

您应该知道Parallel.Foreach不保证操作将使用多少线程(如果是1个或更多),但您可以使用以下命令限制操作的线程数:


尝试Parallel.ForEach并将当前方法包装到任务中

通过创建一个字典来进行查找,而不是枚举每一行,可以提高性能。您的平均搜索时间是N/2,而字典将是Log2(N)。如果AddAttendace方法不是线程安全的,那么我应该做什么?如果它不是线程安全的,那么您不应该在多线程环境中使用它,您应该将其更改为线程安全,或者根本不使用多线程。我不知道AddAttendace方法是否在安全线程中,我已经将Parallel.ForEach用作Parallel.ForEach(AttCollection,ac=>{AddAttendace(branchID,_ep.Get_V(ac.Key,true,null),ac.Value);});我建议你打开另一个关于你的方法和所有相关代码的线程安全性的问题。在_ep.Get_V(ac.Key,true,null)方法中,我得到了随机异常,即“创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。请注意,DbContext和相关类的实例成员不能保证线程安全。”,“对象引用未设置为对象的实例。”,Why?这并不比没有“Why”的注释好多少。
  Parallel.Foreach(AttCollection, new ParallelOptions() { MaxDegreeOfParallelism = 3 },
                    ac => AddAttendace(branchID, _ep.Get_V(ac.Key, true, null), ac.Value));