我正在使用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;
}
}
谢谢
你的问题几乎可以肯定是在你的调用堆栈的上游,代码调用Task<T>.Result
、Task.Wait()
、Task.GetAwaiter().GetResult()
或一些类似的阻塞方法。如果代码在单线程上下文(例如,UI 线程)中的异步代码上阻塞,则可能会死锁。
正确的解决方案是一直使用异步;也就是说,使用 await
而不是阻止异步代码。Fluent 验证具有异步工作流(例如,ValidateAsync
、MustAsync
),因此您需要确保使用它而不是同步 API。