将 await 与异步方法一起使用而无需中间工作有什么好处
本文关键字:工作 中间 什么 await 异步方法 一起 | 更新日期: 2024-10-24 16:53:56
MSDN 使用以下示例:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
因此,GetStringAsync
方法基本上会承诺在将来的某个时候返回字符串类型的 Task,但在调用 DoIndependentWork
时,getString
尚未awaited
,因此它可以继续执行其他工作,直到发生这种情况。
但文档接着说
如果 AccessTheWebAsync 没有任何可以执行的工作 调用 GetStringAsync 并等待其完成,您可以简化 通过调用和等待在以下单个语句中的代码。
string urlContents = await client.GetStringAsync();
如果您只是要立即等待某些事情,这样做有什么好处吗?或者只是为了在应用程序开发时提前准备使用异步?
主要优点是await <some-operation-that-does-I/O>
不会在等待中占用线程,从而提高资源利用率。线程仅在 I/O 完成时才会被委托。系统上的未完成 I/O 请求数可能比等待线程多得多。斯蒂芬·克利里(Stephen Cleary(有一篇关于这个问题的文章,比我更雄辩地解释了它。
一个可等待的异步方法的设计者认为,在执行该方法的某个地方,他很有可能不得不等待某些事情完成。
他没有忙于等待,而是让你有可能做"别的事情",直到你需要方法的结果或无事可做。
可能是您没有"其他事情"要做,但您的呼叫者可能或他的呼叫者。即使没有人有其他事情要做,使用异步也让操作员有机会启动其他事情,例如最小化窗口。我们称之为"保持 UI 响应"。
所以答案是:是的,即使你无事可做,只是等待anyAsyncFunction((,每当你调用任何其他异步函数时,自己成为一个异步函数也是有意义的。