我正在使用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;
}
}
谢谢
答案 0 :(得分:0)
几乎可以肯定,您的问题将在您的调用堆栈中进一步展开,其中代码正在调用Task<T>.Result
,Task.Wait()
,Task.GetAwaiter().GetResult()
或某些类似的阻塞方法。 If your code blocks on asynchronous code in a single-threaded context (e.g., on a UI thread), it can deadlock。
正确的解决方案是使用async all the way;也就是说,使用await
而不是阻塞异步代码。流利的验证具有异步工作流程(例如ValidateAsync
,MustAsync
),因此您需要确保使用异步工作流,而不是同步API。