【问题标题】:Parallel.ForEach ErrorParallel.ForEach 错误
【发布时间】:2018-02-14 05:24:03
【问题描述】:

“System.InvalidOperationException”类型的异常发生在 EntityFramework.dll 但未在用户代码中处理

附加信息:模型在运行时不能使用上下文 正在创建。如果使用上下文,可能会抛出此异常 在 OnModelCreating 方法内,或者如果相同的上下文实例是 多个线程同时访问。请注意,实例成员 不保证 DbContext 和相关类是线程安全的。

IQueryable<VMPARForms> TempfilteredMember = filteredMember;                      

IQueryable<clsPARForms> parformslist = dbcontext.PARForms;

Parallel.ForEach(TempfilteredMember.Where(c => c.PARStatus == 21), item =>
{
    var list = parformslist.Where(x => x.CaseNumber == item.CaseNumber && x.PARID != item.PARID).FirstOrDefault();

    if (list != null)
    {
        item.PARStatus = list.PARStatus;
    }

});

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?
  • 当我使用 foreach() 时,大约需要 4 分钟,因为我有 1lack 记录,所以通过使用 parallel.foreach() 来减少执行时间
  • if the same context instance is accessed by multiple threads concurrently. 你正在这样做。你不能这样做。不要使用Parallel.ForEach

标签: c# parallel.foreach


【解决方案1】:

我认为问题在于您正在尝试创建 EF 上下文的多个对象。文档说

ObjectContext 类不是线程安全的。在多线程场景下,无法保证 ObjectContext 中数据对象的完整性。 The ObjectContext class is not thread safe

上下文不是线程安全的。只要同一实体类的实例不被多个上下文同时跟踪,您仍然可以创建多线程应用程序。 EF Multithreading

根据您的应用程序,您可以使用 ToList() 来具体化您的数据,并根据需要对其进行过滤,或者尝试更改查询的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多