并行线程中的多个dbcontexts,EntityException"当活动用户较少时重新运行您的语句"

Mat*_*rpe 8 c# sql-server parallel-processing entity-framework parallel.foreach

我正在使用Parallel.ForEach多个线程进行工作,每次迭代都使用一个新的EF5 DbContext,所有这些都包含在TransactionScope中,如下所示:

using (var transaction = new TransactionScope())
{
    int[] supplierIds;

    using (var appContext = new AppContext())
    {
        supplierIds = appContext.Suppliers.Select(s => s.Id).ToArray();
    }

    Parallel.ForEach(
        supplierIds,
        supplierId =>
    {
        using (var appContext = new AppContext())
        {
            Do some work...

            appContext.SaveChanges();                
        }
    });

    transaction.Complete();
}
Run Code Online (Sandbox Code Playgroud)

运行几分钟后,它会抛出一个EntityException"底层提供程序在Open上失败",其中包含以下内部细节:

"此时SQL Server数据库引擎的实例无法获取LOCK资源.当活动用户较少时,请重新运行语句.请数据库管理员检查此实例的锁定和内存配置,或检查长时间运行交易."

有谁知道导致这种情况的原因或如何预防?谢谢.

小智 6

你也可以尝试设置的并发任务的最大数量Parallel.ForEach()的使用方法new ParallelOptions { MaxDegreeOfParallelism = 8 }(替换为8的任何你想限制它.

有关详细信息,请参阅MSDN