你什么时候等待任务?

时间:2015-05-30 12:10:38

标签: c# entity-framework asynchronous

假设我有一个Repository类,其中DbContext。在这堂课中,我有一个方法:

public async Task<T> CreateAsync(T obj)
{
    var o = _dbSet.Add(obj);
    await _dbContext.SaveChangesAsync();
    return o;
}

Service类中,我使用此方法创建对象:

public async Task<MyObject> Create()
{
    return await _repository.CreateAsync(new MyObject());
}

最后在我的api控制器MyObjectController中,我这样返回这个对象:

public async Task<IHttpActionResult> Get()
{
    return Ok(await _service.Create());
}

我对所有这些asyncawait个关键字感到困惑。我知道Task是等待的。这是否意味着我可以从Task返回CreateAsync而无需等待CreateAsyncCreate,然后最终在Get等待它?它是否会对我的应用程序产生负面影响,就像我在等待示例一样?

2 个答案:

答案 0 :(得分:4)

  

这是否意味着我可以直接从CreateAsync返回任务而无需同时在CreateAsync或Create中等待,然后最终在Get中等待它?

是的,你可以做到这一点,它实际上更有效率。如果您正在进行等待,每个异步方法将生成一个状态机,这意味着更多的代码和更多的上下文切换

  

它是否会对我的应用程序产生负面影响,就像我在等待示例一样?

由于状态机和上下文切换,会有轻微的性能损失。成本通常远低于通话成本,但最终都会增加。 Async Performance: Understanding the Costs of Async and Await是关于此主题的精彩文章。

正如@Richard Szalay指出的那样,只要确保你最终await该任务,否则任何发生的异常都将被忽视并被吞噬。

答案 1 :(得分:0)

当您希望方法异步运行时,使用

async和await。 没有等待的async是一个同步

异步方法返回任务或无效 等待任务完成

所以await在返回任务

的方法之前使用

您的Get方法正在等待完成您的create()任务,该任务等待完成createAsync任务

等等。

_dbContext.SaveChangesAsync()是异步方法,因此需要aaawait,否则可能返回错误o

如果您需要进一步澄清,请告诉我