FindAsync никогда не возвращается, однако Find работает просто отлично - PullRequest
0 голосов
/ 02 февраля 2019

Я использую 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 Ответ

0 голосов
/ 03 февраля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...