问题描述
我了解了很多有关ASP.NET Core环境中的作用域DbContext(EntityFramework)的信息。
使用范围内的DbContext设置DI框架是有意义的,因为每个请求只有一个DbContext。 不幸的是,不能在Parallel.ForEach循环(或任何类型的线程)中使用此DbContext。 DbContext本身不是线程安全的!所以我必须小心使用任何类型的任务/线程。
但是有时在Parallel.ForEach中实现某些东西(或类似的东西)是必要的(或有用的)。 但是,如何确定Parallel.ForEach中的调用函数不使用任何DbContext?或者也许有一天我决定在某个任务中调用的某些类/函数中使用DbContext,但我不认识它?
对此必须有解决方案吗?现在看来,我完全不能使用TPL(为了安全起见)……但这似乎很奇怪。
没有更好的方法吗?
解决方法
您将必须插入IServiceProvider
并为每次迭代创建自己的作用域。
一个简单的例子如下
Parallel.ForEach(values,value =>
{
using (var scope = _serviceProvider.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<DbContext>();
//query context here
} // The context will be disposed off by the scope
});
通过合并范围获得的服务也将对其进行合并(如果适用)