2016-06-08 59 views
0

我在这里获得了我的记录。如何在并行循环中从IQueryable中获取元素

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

+0

我不使用所提供的链接中的任何图片。顺便说一句,你的动机是什么?它不会加速任何事情。而且你多次调用AsEnumerable()方法。用.ToList()实现IQueryable() –

+0

你可以检查whitch变量是否为空? – llouk

+0

尝试更改变量名称'var drEmployee'为其他内容 –

回答

0

This is my normal loop which is working fine.

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

为了解决这个问题,使用foreach

foreach (var drEmployee in dtEmployee) 
{ 
} 

This is the parallel loop that I want to try.

由于dtEmployee不是线程安全的,从多个线程在同一时间,你不能访问它。这里的修正实际上是相当多的与上面相同:使用Parallel.ForEach()

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

您好@svick,当然,我会先尝试一下。 – Smith

相关问题