await和async的MSDN documentation给出了以下简单示例。
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;
}
然后声明:
如果AccessTheWebAsync之间没有任何工作可以做 调用GetStringAsync并等待其完成,您可以简化 通过以下单个语句调用和等待代码。
string urlContents = await client.GetStringAsync();
但是如果在调用方法和完成它之间没有工作要做,那么使这个方法异步的好处是什么?
答案 0 :(得分:4)
await
关键字表示启动GetStringAsync
方法的线程在执行该方法时可能会自由。
例如,假设这是一个Web服务器(例如,在线程池中有10个线程,负责处理请求)。在那种情况下,在GetStringAsync
调用开始和完成之间,该线程可以自由地执行其他操作。
即使使用10个线程,您也可以以非常有效的方式为10个以上的用户提供服务。如果您的代码中没有await
(并且GetStringAsync
不会是异步,而是阻塞同步方法)并且11个用户会同时访问它,那么其中一个会遇到麻烦,因为没有免费的线程来处理11.请求。
如果该调用将是阻塞同步代码,那么当您的网卡只是等待来自服务器的HTTP响应时,执行将保持在那里并且什么也不做。因此,基本上使用“await
”可以避免只是等待并且什么都不做的线程。
答案 1 :(得分:3)
当您等待异步方法时,线程将被释放以执行其他工作。在同步版本中,该线程将被阻止。
答案 2 :(得分:1)
通常,Async-Await消耗较少的线程,通过减少内存/线程使用来提高可伸缩性。 与同步代码相比,它还提高了响应能力。