.NET Core 7二次调用MediatR处理器时出现IServiceProvider已释放错误
问题:MediatR二次调用处理器时出现IServiceProvider已释放错误
以下是代码简化示例:
private readonly ISender _sender; private readonly ILogger<UserAccountsService> _logger; public UserAccountsService(ISender sender, ILogger<UserAccountsService> logger) { _sender = sender; _logger = logger; } public async void RefreshAccountsFromApi(Guid userId, Z_IF_WEB_LOGINResponse pluralUserAccounts) { // Get user accounts for this user var getUserByIdQuery = new GetUserByIdQuery(userId); Result<User> resultUser = await _sender.Send(getUserByIdQuery); resultUser = await _sender.Send(getUserByIdQuery); // 此处报错 }
每次第二次调用处理器时会触发如下错误:
Cannot access a disposed object.
Object name: 'IServiceProvider'.
MediatR与服务依赖注入注册代码:
services.AddMediatR(cfg => { cfg.RegisterServicesFromAssembly(assembly); cfg.AddOpenBehavior(typeof(LoggingPipelineBehavior<,>)); }); services.AddTransient<IUserAccountsService, UserAccountsService>();
解决方案
核心修复:将
async void改为async Task
普通异步方法禁止使用async void,它仅适用于事件处理场景。使用async void时,调用方无法追踪异步操作的完成状态,会导致当前上下文(包括依赖注入的服务提供者)在异步操作未结束时就被提前释放,这正是二次调用报错的根源。修改后的方法签名应为:public async Task RefreshAccountsFromApi(Guid userId, Z_IF_WEB_LOGINResponse pluralUserAccounts)同时,调用该方法的地方需改为
await RefreshAccountsFromApi(...),确保异步操作能被正确等待。辅助检查:确认处理器生命周期配置
检查GetUserByIdQuery处理器及其依赖服务的生命周期设置。如果处理器依赖了Scoped类型服务,且上下文已被释放,也可能引发类似问题。但修复async void问题后,绝大多数场景下该错误会消失。
内容的提问来源于stack exchange,提问作者Pedro Costa
相关产品推荐
相关产品推荐

