FindAsync никогда не возвращается, однако Find работает просто отлично

Я использую FluentValidation для проверки объектов. Я просто проверяю, существует ли пользователь в базе данных или нет. В моем случае DbContext.Entity.Find работает просто отлично, но DbContext.Entity.FindAsync никогда не возвращается.

Пожалуйста, обратитесь к исходному коду ниже, где это происходит.

    public class ChangeStatusOfUserCommandValidator : AbstractValidator<ChangeStatusOfUserCommand>
{
    private readonly FieldSellDbContext dbContext;
    private ChangeStatusOfUserCommandValidator()
    { }

    public ChangeStatusOfUserCommandValidator(FieldSellDbContext databaseContext)
    {
        dbContext = databaseContext;
        RuleFor(u => u.UserId).NotEmpty();
        RuleFor(u => u.UserId).MustAsync(UserExists).WithMessage("Provided user id already exists in the database.");
    }

    public async Task<bool> UserExists(int value, CancellationToken cancellationToken)
    {
        var user = await dbContext.Users.FindAsync(value, cancellationToken);
        //var user = dbContext.Users.Find(value); --Works fine even in async method
        return user != null;
    }
}

Спасибо

1 ответ

Ваша проблема почти наверняка находится дальше вашего стека вызовов, где код вызывает Task<T>.Result, Task.Wait(), Task.GetAwaiter().GetResult()или какой-то подобный метод блокировки. Если ваш код блокирует асинхронный код в однопоточном контексте (например, в потоке пользовательского интерфейса), он может зайти в тупик.

Правильным решением является использование асинхронного полностью; то есть использовать await вместо блокировки асинхронного кода. Свободная проверка имеет асинхронный рабочий процесс (например, ValidateAsync, MustAsync), поэтому вы должны быть уверены, что используете это, а не синхронные API.

Другие вопросы по тегам