调用EF6 FindAsync会挂起应用程序

时间:2016-07-13 18:55:21

标签: c# entity-framework-6 async-await

我尝试使用Entity Framework 6的异步调用,但每当我调用FindAsync时,应用程序都会挂起,而我永远无法获得控制权。以下是使用Find的方法,其中一切正常。

public CaUsuario GetUsers(RFContext db, int id)
{
        CaUsuario caUsuario = db.CaUsuarios.Find(id);
        if (caUsuario == null)
                throw new ObjectNotFoundException("User not found");
        return caUsuario;
}

以下是我尝试使用asyncTask返回ASync来电。当调用FindAsync时,我从未收到控制权,应用程序挂起。

public async Task<CaUsuario> GetUsers(RFContext db, int id)
{
    CaUsuario caUsuario = await db.CaUsuarios.FindAsync(id);
    if (caUsuario == null)
        throw new ObjectNotFoundException("User not found");
    return caUsuario;
}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

如果没有&#34;一直异步&#34;它可能会挂起。确保使用GetUsersasync关键字调用await正在调用的内容,并且不会错误地尝试使用.Result.Wait()。< / p>

假设以下是消费类:

public class Consumer
{
    private readonly IUserService _userService;
    public Consumer(IUserService  userService)
    {
       _userService = userService;
    }

    public async Task ConsumeAsync()
    {
        // Correct
        var user = await _userService.GetUsers(1);
    }

    public void Consume()
    {
        // Will hang
        var user = _userService.GetUsers(1).Result;
    }
}

答案 1 :(得分:1)

你可能没有在你的调用链/堆栈中一直异步。在调用链中使用Task<T>.Resultawait的组合将导致死锁。