Рассмотрите возможность вызова ConfigureAwait для ожидаемой задачи

Я разрабатываю веб-API, используя шаблон CQRS. У меня есть команда Создать автора.

Вот мой обработчик команд:

internal sealed class AddCommandHandler : ICommandHandler<CreateAuthorCommand, Author>
{
    private readonly IUnitOfWork _unitOfWork;

    public AddCommandHandler(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork));
    }

    public async Task<Result<Author>> Handle(CreateAuthorCommand command)
    {
        var nameResult = Name.Create(command.FirstName, command.LastName);
        var birthDateResult = BirthDate.Create(command.DateOfBirth);
        var mainCategoryResult = Entities.Authors.MainCategory.Create(command.MainCategory);

        var authorResult = Result.Combine(nameResult, birthDateResult, mainCategoryResult)
                            .Map(() => new Author(nameResult.Value, birthDateResult.Value, null, mainCategoryResult.Value));

        if (authorResult.IsFailure)
            return Result.Failure<Author>(authorResult.Error);

        await _unitOfWork.AuthorRepository.AddAsync(authorResult.Value);

        await _unitOfWork.SaveChangesAsync();

        return Result.Success(authorResult.Value);
    }
}

В моем проекте установлены пакеты Microsoft.CodeAnalysis.FxCopAnalyzers и Roslynator.Analyzers nuget. Эти пакеты показывают следующее предупреждение и сообщение для await _unitOfWork.AuthorRepository.AddAsync(authorResult.Value) и await _unitOfWork.SaveChangesAsync().

CA2007 Рассмотрите возможность вызова ConfigureAwait на ожидаемая задача

RCS1090 Вызовите 'ConfigureAwait(false)'.

На этом .ConfigureAwait размещено много вопросов.

Но может ли кто-нибудь объяснить мне с точки зрения непрофессионала, почему я должен это делать? Добавление .ConfigureAwait(false) удалило предупреждение и сообщение. Но мне нужно четко понимать, когда .ConfigureAwait(true) и когда .ConfigureAwait(false). Пожалуйста, помогите и научите меня.


person fingers10    schedule 16.08.2020    source источник
comment
Эта запись в блоге объясняет это довольно хорошо   -  person Simply Ged    schedule 16.08.2020
comment
Мой вопрос в том, что, поскольку это проект API, мне не нужно беспокоиться о контексте синхронизации, и я всегда могу связать .ConfigureAwait(false) с моими await вызовами?   -  person fingers10    schedule 16.08.2020
comment
Если ваш API не принимает делегатов от вызывающей стороны, тогда да, используйте ConfigureAwait(false) везде в вашей библиотеке. Если он принимает делегатов, то вызов их вне контекста синхронизации может быть проблемой. Вы можете увидеть здесь, как библиотека Polly справляется с эта дилемма.   -  person Theodor Zoulias    schedule 16.08.2020