FindAsync永远不会回来,但是查找工作正常

时间:2019-02-02 10:39:07

标签: fluentvalidation ef-core-2.2 fluentvalidation-2.0

我正在使用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 :(得分:0)

几乎可以肯定,您的问题将在您的调用堆栈中进一步展开,其中代码正在调用Task<T>.ResultTask.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而不是阻塞异步代码。流利的验证具有异步工作流程(例如ValidateAsyncMustAsync),因此您需要确保使用异步工作流,而不是同步API。