如何从并行循环中的IQueryable中检索元素

时间:2016-06-08 07:25:26

标签: linq iqueryable parallel.for

我在这里得到了我的记录。

IQueryable<EmployeeItem> dtEmployee = GetAll();

dtEmployee的循环之后。

这是我的正常循环,工作正常。

for (int i = 0; i < dtEmployee.Count(); i++)  
{  
    var drEmployee = dtEmployee.AsEnumerable().ElementAt(i);  
}

这是我想尝试的并行循环。

System.Threading.Tasks.Parallel.For(0, dtEmployee.Count(), i => {
    var drEmployee = dtEmployee.AsEnumerable().ElementAt(i);
});

我没有任何编译错误,但是当我在Visual Studio中运行它时,我收到了这个错误:

screen shot

1 个答案:

答案 0 :(得分:0)

  

这是我的正常循环,工作正常。

我不会说得好,效率极低。由于dtEmployee代表查询,而AsEnumerable()意味着它不再是数据库查询,只是一个懒惰的序列,每个ElementAt()(以及Count())会导致单独的数据库查询,这可能会检索所有员工。

要解决此问题,请使用foreach

foreach (var drEmployee in dtEmployee)
{
}
  

这是我想尝试的并行循环。

由于dtEmployee不是线程安全的,因此您无法同时从多个线程访问它。这里的修复实际上与上面几乎相同:使用Parallel.ForEach()

Parallel.ForEach(dtEmployee, drEmployee => {
});