异步方法跳过等待

时间:2014-10-20 03:22:11

标签: c# asynchronous

我有以下代码:

public async Task<string> GetData(Uri source)
{
    if (client.IsBusy == true) 
        client.CancelAsync ();

    Task<string> tskResult = client.DownloadStringTaskAsync (source);

    string strResult = await tskResult;
    return strResult;
}

当我从 Task<string>... 开始逐步执​​行此方法时,调试器跳过 return strResult; 并且strResult的值为null。

为什么会这样? 感谢。

PS:我这样称呼这个方法:

StringBuilder strBuild = new StringBuilder();

foreach (var image in imageApiUrlLst)
 {
   string imageModelPull = await callMgr.GetData(new Uri(image)); ///WHY GETS STUCK!
   strBuild.AppendLine(imageModelPull);
  }

2 个答案:

答案 0 :(得分:1)

如果等待的事情尚未完成,则async方法会在到达await语句时立即返回。完成后,该方法将在await语句后继续执行。尝试在return语句上设置一个断点,它应该被击中两次。

答案 1 :(得分:0)

aysnc将该方法标记为异步。 await是从结果返回时执行将继续执行的地方。

当你提出获取tskResult执行的请求时,无法完成以下步骤,因为执行必须等待(可能是很多时钟周期),因此在首先放下一个标记后,它会跳过这个方法。

当DownloadStringTaskAsync完成后,它将返回此方法,然后只分配结果。实时调用启动后可能会产生数百万个CPU时钟周期,一次调试一行,您将看到跳转,然后再回调。

给你回归strResult的断点,不要介入。只需等待客户端调用后返回.DownloadStringTaskAsync返回。

此外,如果在执行此方法期间存在异常,那么这将是&#34;消耗&#34;通过该方法,如果代码在您的返回时没有中断,则将整个块包装在try catch中,并在catch中放置一个断点 - 这样您就可以看到您正在获得的异常。