3

I am using FluentValidation to validate the objects. I am simply checking checking whether the user exists in database or not. In my case, DbContext.Entity.Find works just fine but DbContext.Entity.FindAsync never returns.

Please refer to the below source code where it is happening.

    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;
    }
}

Thanks

4

1 回答 1

0

您的问题几乎可以肯定在您的调用堆栈中更进一步,代码正在调用Task<T>.Result, Task.Wait(),Task.GetAwaiter().GetResult()或一些类似的阻塞方法。如果您的代码阻塞在单线程上下文中的异步代码上(例如,在 UI 线程上),它可能会死锁

正确的解决方案是一直使用async;也就是说,使用await而不是阻塞异步代码。Fluent 验证有一个异步工作流(例如 , ValidateAsyncMustAsync,因此您需要确保使用它而不是同步 API。

于 2019-02-02T23:20:22.660 回答