[英]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.