HTTP 请求处于挂起状态,直到执行 MediatR 通知

HTTP request in pending status until MediatR notifications executed

var response = SaveOrderInDB();
OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent(x, y, z);            
_requestRouter.Publish(orderCreatedEvent);
return response;

根据 MediatR 文档,通知是 "Fire and forget" 功能。我不使用 await 因为我想 return 在通知发布后立即 "response" 反对客户端 Angular 应用程序。 但是,当我在通知处理程序中放置断点时,我在 Chrom 开发工具中看到请求仍处于挂起状态,等待通知完成。

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

如何不等待通知完成?

如评论中所述,断点阻止他们完成。

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

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

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

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

您会看到响应没有挂​​起,并且在 5 秒后,您的断点被命中。
(如果没有设置断点,则"Done."会写入控制台)

MediatR 的通知默认不是 "Fire and forget"。 "Publish strategies".

标题下的文档状态

The default implementation of Publish loops through the notification handlers and awaits each one. This ensures each handler is run after one another.

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