【问题标题】:HTTP request in pending status until MediatR notifications executed在执行 MediatR 通知之前,HTTP 请求处于待处理状态
【发布时间】:2019-12-03 17:11:01
【问题描述】:
var response = SaveOrderInDB();
OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent(x, y, z);            
_requestRouter.Publish(orderCreatedEvent);
return response;

根据 MediatR 文档,通知是“即发即弃”功能。我不使用 await,因为我想在发布通知后立即将“响应”对象返回给客户端 Angular 应用程序。 但是,当我在通知处理程序中放置断点时,我在 Chrom 开发工具中看到请求仍处于挂起状态,等待通知完成。

 public Task Handle(OrderCreatedEvent notification, CancellationToken cancellationToken)
    {
        return Task.CompletedTask; // Breakpoint is here 
    }

我怎么能不等待通知完成?

【问题讨论】:

  • 阻止它返回任务的断点不是完成了吗?
  • @DavidEdel 是的,是的。也许我不够清楚。我的问题是如何发布 MediatrR 通知,而无需像屏幕截图那样等待它们完成。

标签: c# asp.net-core mediatr


【解决方案1】:

如 cmets 中所述,断点阻止它们完成。

如果您不相信,请将您的 NotificationHandler 更改为:

public async Task Handle(OrderCreatedEvent notification, CancellationToken cancellationToken)
{
    await Task.Delay(5000);

    Console.Write("Done."); //put a breakpoint here
}

Console.Write 方法上放置一个断点,然后运行您的应用程序,并调用您的端点。

您将看到响应未挂起,并且 5 秒后,您的断点被命中。
(如果您没有设置断点,则将“完成。”写入控制台)

【讨论】:

    【解决方案2】:

    默认情况下,MediatR 的通知不是“一劳永逸”。文档在“发布策略”标题下声明。

    发布的默认实现循环通过通知处理程序并等待每个处理程序。这样可以确保每个处理程序一个接一个地运行。

    如果您不想等待通知,则必须覆盖 mediator.cs 类中 PublishCore 方法的行为。 文档提到这可以在上面的相同标题下完成,并指向MediatR.Examples.PublishStrategies 下的一些示例代码。查看该示例中 Publisher.cs 中的 ParallelNoWait 方法,了解其工作原理。

    【讨论】:

    • 我确实看过它,但我不清楚如何使用 MediatR 将这些发布策略添加到现有项目中。我创建了一个帖子但没有收到我可以接受的答案:stackoverflow.com/questions/59320296/… 你能回答一下吗?
    猜你喜欢
    • 2012-12-30
    • 2019-11-09
    • 2013-04-23
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多