我正在 azure 上创建一个应用程序服务,它将使用 azure 服务总线上的多个主题。该程序包含一个线程公关主题,并将它们处理到 MSSQL 数据库中。
我遇到的问题是:
这意味着我将有一个活跃的消费者线程、pr 主题,并且每个线程需要写入不同的 MSSQL 表。
这会导致一个问题,因为我写的代码是这样的:
using var scope = serviceScopeFactory.CreateScope();
using var context = scope.ServiceProvider.GetRequiredService<MyDbContext>();
每个线程都会创建一个上下文,并在服务总线消息消耗的线程处理范围内使用它。至少这是想法。
但是,当我尝试使用上下文来确定对象是否已经存在时,程序会抛出异常,声称上下文仍在生成模型的过程中。
我不知道为什么,我以为我要么错误配置了服务的生命周期,要么没有充分实现一些并行处理技术。
解决方案是这样写:
using var scope = serviceScopeFactory.CreateScope();
await using var context = scope.ServiceProvider.GetRequiredService<MyDbContext>();
当您异步要求范围生成模型时,您实际上已经等待它完成! 我觉得自己很愚蠢,忽略了这一点。
无论如何。我希望这可以帮助其他人避免花费太多时间来调试这样的问题。