Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTTP request in pending status until MediatR notifications executed

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

By MediatR docs the notifications is "Fire and forget" feature. I do not use await since I want to return immediately "response" object to client Angular app after notification was published. However when I put breakpoint in notification handler I see in Chrom dev tools that request still in pending status, waits for notification to finish.

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

How can I not wait for notifications to finish? enter image description here

like image 747
Nick Avatar asked Oct 11 '25 12:10

Nick


2 Answers

As mentioned in the comments, the breakpoint is preventing them from completing.

If you don't believe this, change your NotificationHandler to something like:

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

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

Put a breakpoint on the Console.Write method, then run your application, and call your endpoint.

You'll see the response isn't pending, and after 5 seconds, your breakpoint is hit.
(or "Done." is written to the console if you didn't set a breakpoint)

like image 182
Alex Avatar answered Oct 14 '25 00:10

Alex


MediatR's Notifications aren't "Fire and forget" by default. The docs state under the heading "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.

If you want to have notifications not be awaited on you will have to override the behaviour of the PublishCore method in the mediator.cs class. The documentation mentions this can be done under the same header above and points to some sample code under MediatR.Examples.PublishStrategies. Have a look at the method ParallelNoWait in Publisher.cs in that sample to see how it works.

like image 25
Mathew Spearey Avatar answered Oct 14 '25 02:10

Mathew Spearey