在没有中间工作的情况下使用等待异步方法有什么好处?

时间:2016-04-21 07:29:58

标签: c# async-await

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方法将基本承诺在将来的某个时刻返回类型字符串的任务,但是在调用DoIndependentWork时,getString还没有已经awaited,所以它可以继续做其他工作,直到发生这种情况。

但是文档然后说

  

如果AccessTheWebAsync之间没有任何工作可以做   调用GetStringAsync并等待其完成,您可以简化   通过以下单个语句调用和等待代码。

string urlContents = await client.GetStringAsync();

如果您只是想立即等待某事,那么这样做是否有任何好处?或者只是因为您在应用程序开发过程中提前准备使用异步?

2 个答案:

答案 0 :(得分:2)

主要优点是await <some-operation-that-does-I/O>不会在等待中占用线程,从而提高资源利用率。只有在I / O完成时才会调试线程。您可以在系统上拥有比等待线程更多的未完成I / O请求。 Stephen Cleary有一个article on this,比我能更有说服力地解释它。

答案 1 :(得分:1)

一个令人期待的异步方法的设计者,认为在执行该方法的某个地方,他必须等待某些东西才能完成的机会很高。

而不是忙碌的等待,他给你的可能性&#34;其他东西&#34;直到你需要方法的结果或者不再需要做任何事情。

可能你没有&#34;别的东西&#34;但你的来电者可能或他的来电者。即使没有人做其他事情,使用async也可以让操作员有机会启动其他操作,例如最小化窗口。我们称之为&#34;保持用户界面响应&#34;。

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