将 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 与异步方法一起使用而无需中间工作有什么好处

主要优点是await <some-operation-that-does-I/O>不会在等待中占用线程,从而提高资源利用率。线程仅在 I/O 完成时才会被委托。系统上的未完成 I/O 请求数可能比等待线程多得多。斯蒂芬·克利里(Stephen Cleary(有一篇关于这个问题的文章,比我更雄辩地解释了它。

一个可等待的异步方法的设计者认为,在执行该方法的某个地方,他很有可能不得不等待某些事情完成。

他没有忙于等待,而是让你有可能做"别的事情",直到你需要方法的结果或无事可做。

可能是您没有"其他事情"要做,但您的呼叫者可能或他的呼叫者。即使没有人有其他事情要做,使用异步也让操作员有机会启动其他事情,例如最小化窗口。我们称之为"保持 UI 响应"。

所以答案是:是的,即使你无事可做,只是等待anyAsyncFunction((,每当你调用任何其他异步函数时,自己成为一个异步函数也是有意义的。