【发布时间】:2021-03-11 04:18:54
【问题描述】:
我的 DI 容器中注册了多个 IHostedService (BackgroundService) 实例。
services.AddHostedService<ResourceMatchingMessageListeningService>();
services.AddHostedService<ResourceMatchingMessageListeningService2>();
services.AddHostedService<ResourceMatchingMessageListeningService3>();
services.AddHostedService<ResourceMatchingMessageListeningService4>();
services.AddHostedService<ResourceMatchingMessageListeningService5>();
每个服务都侦听不同的 Azure 服务总线队列。收到消息时,它会通过 EF Core 写入数据库。如果我运行一个服务,它工作正常,只要我运行 2 个或更多,我就会收到错误:
在前一个操作之前在此上下文上启动了第二个操作 完全的。这通常是由于不同的线程使用相同的 DbContext 的实例。
我假设出现此错误是因为 EF Core 不是线程安全的,并且托管服务都在不同的线程中运行。
我厌倦了通过将 EF 的服务生命周期设置为瞬态来解决此问题),但我仍然遇到同样的错误。
services.AddDbContext<MyDataContext>(options =>
options.UseSqlServer(connectionString, sqlServerOptions =>
sqlServerOptions.CommandTimeout(120)),
ServiceLifetime.Transient, ServiceLifetime.Transient);
对这里的潜在解决方案有什么建议吗?
【问题讨论】:
-
你试过作用域吗?
标签: c# asp.net azure entity-framework azureservicebus