无法等待任务<myobject>

时间:2016-07-01 11:23:23

标签: c# async-await asp.net-web-api2

我无法弄清楚为什么以下代码不断抛出“无法等待”#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;
}

1 个答案:

答案 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.RunTask.Factory.StartNew的手动调用更受欢迎。