MSDN异步示例here给出了以下示例:
async Task<int> AccessTheWebAsync()
{
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
基本上,根据我的理解,您可以在调用异步方法和使用其结果之间进行独立工作。但是,在示例中,他们添加了
如果AccessTheWebAsync之间没有任何工作可以做 调用GetStringAsync并等待其完成,您可以简化 通过以下单个语句调用和等待代码。
string urlContents = await client.GetStringAsync();
现在,假设存在同步client.GetString()
方法并且之间没有可以完成的独立工作,那么写这样的东西会带来什么好处吗?在这种情况下,这两个呼叫是否有任何不同?:
string urlContents = await client.GetStringAsync();
vs
string urlContents = client.GetString();
答案 0 :(得分:0)
在这种情况下,这两个电话是否有任何不同之处?:
是他们是不同的。
第一个导致该方法不在UI线程上执行,这将导致您的应用程序保持响应,而在第二个不是这种情况,并且如果方法执行需要更多时间,UI将保持阻止,用户无法与应用程序进行交互。
string urlContents = await client.GetStringAsync(); // non blocking call
string urlContents = client.GetString(); // this is blocking current Thread
答案 1 :(得分:0)
第一个将等到客户端返回并阻止其他任何内容,然后再转到下一行。
第二个将等到客户端返回后再转到下一行,但同时其他线程可以完成不依赖于结果的工作。
答案 2 :(得分:0)
在这种情况下,这两个电话是否有所不同?
是
第一个是异步;这意味着在GetStringAsync
正在进行时,调用线程被释放以执行其他操作。
第二个是同步;这意味着在GetString
正在进行时,调用线程被阻止。
在客户端,异步代码的主要好处是响应性。也就是说,UI线程被释放以响应用户输入。
在服务器端,异步代码的主要好处是可伸缩性。也就是说,请求线程被释放以响应其他请求。