我有以下代码:
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);
}
答案 0 :(得分:1)
如果等待的事情尚未完成,则async
方法会在到达await
语句时立即返回。完成后,该方法将在await
语句后继续执行。尝试在return语句上设置一个断点,它应该被击中两次。
答案 1 :(得分:0)
aysnc将该方法标记为异步。 await是从结果返回时执行将继续执行的地方。
当你提出获取tskResult执行的请求时,无法完成以下步骤,因为执行必须等待(可能是很多时钟周期),因此在首先放下一个标记后,它会跳过这个方法。
当DownloadStringTaskAsync完成后,它将返回此方法,然后只分配结果。实时调用启动后可能会产生数百万个CPU时钟周期,一次调试一行,您将看到跳转,然后再回调。
给你回归strResult的断点,不要介入。只需等待客户端调用后返回.DownloadStringTaskAsync返回。
此外,如果在执行此方法期间存在异常,那么这将是&#34;消耗&#34;通过该方法,如果代码在您的返回时没有中断,则将整个块包装在try catch中,并在catch中放置一个断点 - 这样您就可以看到您正在获得的异常。