关于堆栈溢出的一些帖子提出了以下建议:
任何异步方法,其中有一个等待表达式等待任务或任务< T>,在方法结束时没有进一步处理,最好不使用async / await写入。
这个建议仅适用于特定情况吗?在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
这样的方法造成伤害吗?
答案 0 :(得分:6)
删除await
并返回Task
并不会使方法同步。 await
是一个使方法异步更容易的工具。它不是唯一方法使方法异步。它就在那里,因为它允许你比没有它更容易添加任务的延续,但是在你已经显示的方法中你实际上没有利用{{1完成任何事情的关键字因此你可以删除它并使代码的功能完全相同。
(请注意,从技术上讲,删除await
会略微改变异常的语义;如果对您很重要,则抛出异常将从方法抛出,而不包含在返回的async
中。就任何来电者而言,这是唯一可观察到的差异。)
答案 1 :(得分:3)
在没有async-await关键字的情况下编写这些方法并不能使它们同步。
这个想法是直接返回任务,而不是产生生成状态机的开销。
实际差异在于异常处理。异步方法在返回的任务中封装异常,而简单的任务返回方法则不包含。
例如,如果FixData抛出异常,它将在异步方法中捕获,但直接抛入返回一个的简单任务中。两种选择都是同步异步的。