Search code examples
c#async-awaittaskcqrsmediatr

IRequestHandler return void


Please see the code below:

public class CreatePersonHandler
    : IRequestHandler<CreatePersonCommand,bool>
{
    public async Task<bool> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
    {
        return true;
    }
}

It works as expected i.e. the hander is reached and returns true. How do I deal with the scenario where the handler returns nothing? I want to do this:

public async void Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
    //don't return anything
}

I have spent the last two hours Googling this. For example, I have looked here: Register a MediatR pipeline with void/Task response and here: https://github.com/jbogard/MediatR/issues/230.


Solution

  • Generally speaking, if a Task based method does not return anything you can return a completed Task

        public Task Handle(CreatePersonCommand message, CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    

    Now, in MediatR terms a value needs te be returned. In case of no value you can use Unit:

        public Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
        {
            return Task.FromResult(Unit.Value);
        }
    

    or, in case of some async code somewhere

        public async Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
        {
            await Task.Delay(100);
    
            return Unit.Value;
        }
    

    The class signature should then be:

    public class CreatePersonHandler : IRequestHandler<CreatePersonCommand>
    

    which is short for

    public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, Unit>