IRequestHandler return void

w0051977 picture w0051977 · Feb 14, 2019 · Viewed 8.4k times · Source

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.

Answer

Peter Bons picture Peter Bons · Feb 14, 2019

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>