我无法弄清楚为什么以下代码不断抛出“无法等待”#39;错误...
我有一种感觉,在实现异步API操作方面,我可能会遇到错误的结果。任何人都可以指导我出错的地方吗?
API操作:
[HttpGet]
public async Task<IHttpActionResult> Get(int id)
{
var getAnimal = animalManager.Get(id);
var animal = await getAnimal;
return Ok(animal);
}
经理/服务方式:
public async Task<Animal> Get(int id)
{
return await Task.Run(() => { return animalRepository.Get(id); });
}
存储库方法(同步):
public Animal Get(int id)
{
var animal = dbSet.Find(id);
if (animal == null)
{
throw new ArgumentNullException("Animal");
}
return animal;
}
答案 0 :(得分:1)
不使用dbSet.Find
,而是使用dbSet.FindAsync
。请考虑以下事项:
<强>回购强>
public Task<Animal> GetAsync(int id)
{
return dbSet.FindAsync(id);
}
<强>服务强>
public Task<Animal> GetAsync(int id)
{
return animalRepository.GetAsync(id);;
}
<强> API 强>
然后,API中的源代码将按您的预期运行。您可以通过等待呼叫而不是接受Task<Animal>
变量来简化它,并产生您的动物。
[HttpGet]
public async Task<IHttpActionResult> Get(int id)
{
var animal = await animalManager.GetAsync(id);
return Ok(animal);
}
此外,您的repo和服务层代码可以轻松返回代表异步操作的Task
,而不是等待它。利用现有的API,特别是 EF 。这比Task.Run
或Task.Factory.StartNew
的手动调用更受欢迎。