在没有独立工作可以做有用/值得的时候使用异步吗?

时间:2016-04-12 10:26:22

标签: c# asynchronous

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

3 个答案:

答案 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线程被释放以响应用户输入。

在服务器端,异步代码的主要好处是可伸缩性。也就是说,请求线程被释放以响应其他请求。