我尝试使用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;
}
以下是我尝试使用async
,Task
返回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;
}
我做错了什么?
答案 0 :(得分:2)
如果没有&#34;一直异步&#34;它可能会挂起。确保使用GetUsers
和async
关键字调用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>.Result
和await
的组合将导致死锁。