System.InvalidoperationException:开始了第二次操作 在完成之前的操作之前,此上下文实例。这是 通常是由不同的线程同时引起的 dbContext的实例。有关如何避免线程的更多信息 DBContext的问题,请参阅 https://go.microsoft.com/fwlink/?linkId =2097913
UPD:要明确,我遵循上面的链接,阅读DBContext的工作原理并审查了我的代码。现在,我正在寻找找到错误的程序化方法。
找到问题根源的好方法是什么?我想以某种方式记录是否使用多个线程同时使用dbcontext的相同实例。我已经审查了文档中描述的任何缺失或其他明显的并发陷阱的代码。
代码库太大,无法在这里共享。简而言之,有一个await
用
BackgroundService
旋转20个线。每个线程都会创建一个新范围:
Task.Run()
我的理解是为每个范围创建一个新的dbContext实例,因为所有请求dbcontext的实例均以范围注册为范围:public IMessageHandler Create()
{
var scope = serviceProvider.CreateScope();
return scope.ServiceProvider.GetRequiredKeyedService<IMessageHandler>(ServiceKeys.XYZ);
}
我不使用合并的DB上下文,btw.不直接您的问题,但可能相关:
services.AddDbContext<MyDbContext>();
NOTICE
在这种情况下,您的
CreateScope
实例很可能会被处置。 您需要所有使用范围中资源完成资源的工作。 better做这样的事情:
IMessageHandler