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.