在EF的单个上下文类上运行多个线程

本文关键字:运行 线程 EF 单个 上下文 | 更新日期: 2023-09-27 18:17:22

我有一些长时间采取的过程(从Db像国家列表,企业列表(约1500行)获取数据)。所以我创建了一个单独的方法来获取这些数据。

But It is said

在创建模型时不能使用上下文。这类中使用上下文可能会引发方法访问相同的上下文实例并发多个线程。注意DbContext的实例成员并且相关的类不能保证是线程安全的。

private IList<Business> GetBusiness(IRepositories repos, IImageStore store)
{
    var data = repos.BusinessRepo.GetAll();
    //Some more calculation on the basis of Data.
    return data;
}
**similar function for country**

现在我从main

调用这些方法
Task<List<Business>>[] taskBusiness = new Task<List<Business>>[1];
 taskBusiness[0] = Task.Run(() => GetBusiness(repos, imageStore));
 Task<List<Country>>[] taskCountry = new Task<List<Country>>[1];
 taskCountry[0] = Task.Run(() => GetCountry(repos, imageStore));
 //Some More calculation
 .
 .
 // before method end
 Task.WaitAll(taskBusiness);
 Task.WaitAll(taskCountry);
 var business = taskBusiness[0].Result;
 var country = taskCountry[0].Result;

在EF的单个上下文类上运行多个线程

DbContext类不是线程安全的(你的错误消息几乎告诉你),所以你不应该在多个线程中使用相同的实例。相反,您应该为每个同时调用创建一个不同的对象。

来自DbContext的MSDN文档(重点是我的):

Thread Safety:此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的