等待最后的方法调用

Awaiting last method call

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

Any async method where you have a single await expression awaiting a Task or Task < T >, right at the end of the method with no further processing, would be better off being written without using async/await.

Architecture for async/await

Await or Return

此建议仅适用于特定情况吗?在 Web 服务器上,这不是使用 async/await 的主要原因之一,因为在等待下面的 UpdateDataAsync 方法时,Thread 将 return 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 之类的方法,不是吗?

删除 await 并仅返回 Task 不会使方法同步 await 是一种可以更轻松地使方法异步的工具。这不是使方法异步的 only 方法。它在那里是因为它允许你比没有它更容易地向任务添加延续,但是在你展示的方法中 你实际上并没有利用 await 关键字来完成任何事情 因此您可以删除它并使代码的功能完全相同。

(请注意,从技术上讲,异常的语义将通过删除 async 略有改变;抛出的异常将从方法中抛出,而不是包含在返回的 Task 中,如果它很重要你。就任何调用者而言,这是唯一可以观察到的区别。)

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

想法是直接return任务,而不是产生状态机的开销。

实际的区别在于异常处理。异步方法将异常封装在 returned 任务中,而简单任务 returning 方法则不会。

例如,如果 FixData 抛出异常,它将在异步方法中捕获,但直接在简单任务 returning 中抛出。这两个选项同样是异步的。