等待最后一个方法调用

时间:2015-04-14 18:12:34

标签: c# .net asynchronous async-await

关于堆栈溢出的一些帖子提出了以下建议:

  

任何异步方法,其中有一个等待表达式等待任务或任务< T>,在方法结束时没有进一步处理,最好不使用async / await写入。

Architecture for async/await

Await or Return

这个建议仅适用于特定情况吗?在Web服务器上,使用async/await并不是主要原因之一,因为在等待下面的UpdateDataAsync方法时,Thread将返回ThreadPool ,允许服务器处理其他请求?

SaveDataAsync是否应该等待数据库更新调用,因为它是方法中的最后一次调用?

public async Task WorkWithDataAsync(Data data)
{
    ManipulateData(data);
    await SaveDataAsync(data);
    await SendDataSomewhereAsync(data);
}

public async Task SaveDataAsync(Data data)
{
    FixData(data);
    await DBConnection.UpdateDataAsync(data);
}

另外,如果您不知道将使用SaveDataAsync的哪个位置,那么使其同步会对WorkWithDataAsync这样的方法造成伤害吗?

2 个答案:

答案 0 :(得分:6)

删除await并返回Task 并不会使方法同步await是一个使方法异步更容易的工具。它不是唯一方法使方法异步。它就在那里,因为它允许你比没有它更容易添加任务的延续,但是在你已经显示的方法中你实际上没有利用{{1完成任何事情的关键字因此你可以删除它并使代码的功能完全相同。

(请注意,从技术上讲,删除await会略微改变异常的语义;如果对您很重要,则抛出异常将从方法抛出,而不包含在返回的async中。就任何来电者而言,这是唯一可观察到的差异。)

答案 1 :(得分:3)

在没有async-await关键字的情况下编写这些方法并不能使它们同步。

这个想法是直接返回任务,而不是产生生成状态机的开销。

实际差异在于异常处理。异步方法在返回的任务中封装异常,而简单的任务返回方法则不包含。

例如,如果FixData抛出异常,它将在异步方法中捕获,但直接抛入返回一个的简单任务中。两种选择都是同步异步的。