等待最后的方法调用
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 中抛出。这两个选项同样是异步的。
一些关于堆栈溢出的帖子提出了以下建议:
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 中抛出。这两个选项同样是异步的。