ABP(.NET Core3.1)中如何避免DbContext多线程问题?
ABP框架多线程场景下DbContext与仓储使用问题咨询
我正在使用基于.NET Core 3.1的ABP框架项目,存在如下业务场景:需要为每个服务总线主题创建独立线程,所有线程都会调用仓储获取数据库数据,仓储定义如下:
IRepository<Product, long> _productRepository
我想咨询:
- 是否需要因DbContext的多线程问题避免使用IRepository?还是IRepository会自行处理该问题?
- 若不能自行处理,该如何解决?我推测可以为DbContext创建生命周期作用域,但ABP框架是否提供了相关处理方案?例如IUnitOfWorkManager?
- 如果创建DbContext生命周期作用域是唯一方案,能否提供ABP中的实现代码示例?感谢。
更新1
我已在初始阶段创建了生命周期作用域,代码如下:
var topics = await _queueAdmin.GetAllTopicsAsync(); var tasks = topics.Select(async topic => { using (var scope = _serviceProvider.CreateScope()) { var queue = scope.ServiceProvider.GetRequiredService<IQueue>(); await queue.ProcessTopicMessagesAsync<T>(topic, subscriptionName, callback, cancellationToken); } }); await Task.WhenAll(tasks);
更新2
服务总线中每个租户对应一个主题,我有一个后台服务每15分钟运行一次,并行处理所有主题的消息。每次从主题提取50条消息,调用数据库获取每条消息的相关信息,再发送到微服务存入数据库,直到主题消息处理完毕。
IQueue已注册为作用域服务,注册代码如下:
IocManager.IocContainer.Register( Component .For<IQueue>() .ImplementedBy<ServiceBusQueueService>() .LifestyleCustom<MsScopedLifestyleManager>() );
内容的提问来源于stack exchange,提问作者Ask
相关产品推荐
相关产品推荐

