等待和异步使用

时间:2015-12-01 12:15:05

标签: c# async-await

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();

但是如果在调用方法和完成它之间没有工作要做,那么使这个方法异步的好处是什么?

3 个答案:

答案 0 :(得分:4)

await关键字表示启动GetStringAsync方法的线程在执行该方法时可能会自由。

例如,假设这是一个Web服务器(例如,在线程池中有10个线程,负责处理请求)。在那种情况下,在GetStringAsync调用开始和完成之间,该线程可以自由地执行其他操作。

即使使用10个线程,您也可以以非常有效的方式为10个以上的用户提供服务。如果您的代码中没有await(并且GetStringAsync不会是异步,而是阻塞同步方法)并且11个用户会同时访问它,那么其中一个会遇到麻烦,因为没有免费的线程来处理11.请求。

如果该调用将是阻塞同步代码,那么当您的网卡只是等待来自服务器的HTTP响应时,执行将保持在那里并且什么也不做。因此,基本上使用“await”可以避免只是等待并且什么都不做的线程。

答案 1 :(得分:3)

当您等待异步方法时,线程将被释放以执行其他工作。在同步版本中,该线程将被阻止。

答案 2 :(得分:1)

通常,Async-Await消耗较少的线程,通过减少内存/线程使用来提高可伸缩性。 与同步代码相比,它还提高了响应能力。

检查Advantages of Async-Await