You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:42:41