【问题标题】:How to retrieve element from IQueryable in Parallel Loop如何在并行循环中从 IQueryable 中检索元素
【发布时间】:2016-06-08 07:25:25
【问题描述】:

我的记录在这里。

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 中运行它时,我得到了这个错误:

【问题讨论】:

  • 我没有看到使用提供的链接的任何图像。顺便说一句,您并行运行此程序的动机是什么?它不会加速任何事情..而且您多次调用 AsEnumerable() 方式。只需使用 .ToList() 实现 IQueryable
  • 你能检查一下哪个变量是空的吗?
  • 尝试将变量名 'var drEmployee' 更改为其他名称
  • GetAll() 是做什么的?是数据库查询吗?你为什么用for而不是foreach
  • 嗨@PeterBons,使用并行的原因是为了加快我原来的 for 循环。它确实加快了很多。上次,原始循环花了 2 个小时。更改为Parallel后,大约需要10分钟。是不是因为 IQueryable 不是线程安全的?

标签: linq iqueryable parallel.for


【解决方案1】:

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

我不会说很好,它的效率非常低。因为dtEmployee 代表一个查询,而AsEnumerable() 意味着它不再是一个数据库查询,只是一个惰性序列,每个ElementAt()(还有Count())都会导致一个单独的数据库查询,这可能会检索所有员工。

要解决此问题,请使用foreach

foreach (var drEmployee in dtEmployee)
{
}

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

由于dtEmployee 不是线程安全的,您不能同时从多个线程访问它。这里的修复其实和上面的差不多:使用Parallel.ForEach():

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

【讨论】:

  • 嗨@svick,当然,我会先试试。
猜你喜欢
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2011-08-06
  • 1970-01-01
  • 2011-02-25
  • 2021-01-06
相关资源
最近更新 更多