gpt4 book ai didi

c# - EF 和 IHostedService 的多个实例

转载 作者:行者123 更新时间:2023-12-02 08:23:21 24 4
gpt4 key购买 nike

我在 DI 容器中注册了多个 IHostedService (BackgroundService) 实例。

services.AddHostedService<ResourceMatchingMessageListeningService>();
services.AddHostedService<ResourceMatchingMessageListeningService2>();
services.AddHostedService<ResourceMatchingMessageListeningService3>();
services.AddHostedService<ResourceMatchingMessageListeningService4>();
services.AddHostedService<ResourceMatchingMessageListeningService5>();

每个服务监听不同的 Azure 服务总线队列。收到消息时,它会通过 EF Core 写入数据库。如果我运行一个服务,它工作正常,一旦我运行 2 个或更多服务,我就会收到错误:

A second operation started on this context before a previous operationcompleted. This is usually caused by different threads using the sameinstance of DbContext.

我假设出现此错误是因为 EF Core 不是线程安全的,并且托管服务都在不同的线程中运行。

我厌倦了通过将 EF 的服务生命周期设置为 transient 来解决此问题),但我仍然遇到相同的错误。

services.AddDbContext<MyDataContext>(options => 
options.UseSqlServer(connectionString, sqlServerOptions =>
sqlServerOptions.CommandTimeout(120)),
ServiceLifetime.Transient, ServiceLifetime.Transient);

这里有关于潜在解决方案的任何建议吗?

最佳答案

您需要为每个托管服务创建一个新的服务范围,然后从该范围请求 DbContext。

using var scope = services.CreateScope();
var context = scope.ServiceProvider.GetService<MyDataContext>();

您可能希望为您处理的每条消息创建一个服务范围。甚至可能有一个单独的作用域服务来处理每条消息。

不幸的是,该实现开始看起来像服务定位器反模式。

关于c# - EF 和 IHostedService 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66576422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com