繁体   English   中英

异步方法跳过等待

[英]Async Method skips await

我有以下代码:

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>...开始逐步执​​行此方法时Task<string>...调试器跳过return strResult; 并且 strResult 的值为空。

为什么会发生这种情况? 谢谢。

PS:我是这样调用这个方法的:

StringBuilder strBuild = new StringBuilder();

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

如果await的事情尚未完成,则只要到达await语句, async方法就会返回。 一旦完成,该方法将在该await语句之后继续执行。 尝试在 return 语句上放置一个断点,它应该会被击中两次。

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

当您发出获取 tskResult 的请求时,执行无法完成以下步骤,因为执行必须等待(可能有多个时钟周期),因此在首先放置一个关于它应该返回的位置的标记后,它会跳过此方法。

当 DownloadStringTaskAsync 完成后,它将返回到此方法,然后才分配结果。 在调用开始后,这可能是实时的数百万个 CPU 时钟周期。通过调试器一次一行地执行,您将看到跳转,稍后会看到回调。

把你的断点放在 return strResult 上,不要单步执行。 只需等待 client.DownloadStringTaskAsync 返回后调用返回。

此外,如果在此方法的执行过程中出现异常,那么这将被该方法“消耗”,因此如果代码在返回时没有中断,则将整个块包装在 try catch 中,并在 catch 中放置一个断点 -所以你可以看到你得到了什么异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM