异步方法跳过等待
本文关键字:等待 异步方法 | 更新日期: 2023-09-27 18:27:02
我有以下代码:
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=新StringBuilder();
foreach (var image in imageApiUrlLst)
{
string imageModelPull = await callMgr.GetData(new Uri(image)); ///WHY GETS STUCK!
strBuild.AppendLine(imageModelPull);
}
一旦到达await
语句,如果等待的事情还没有完成,async
方法就会返回。一旦完成,该方法将在await
语句之后继续执行。试着在return语句上加一个断点,它应该会被击中两次。
aysnc将该方法标记为异步。wait是从调用返回结果时开始继续执行的位置。
当您请求获取tskResult时,执行无法完成以下步骤,因为执行必须等待(可能需要许多时钟周期),因此它在第一次标记返回位置后跳过此方法。
DownloadStringTaskAsync完成后,它将返回到此方法,然后ONLY分配一个结果。实时地,这可能是在呼叫发起之后的数百万个CPU时钟周期。,通过调试程序一次一行,您将看到跳转,然后再看到回调。
在返回strResult时设置断点,不要遍历。只需等待客户打来的电话。DownloadStringTaskAsync返回。
此外,如果在执行该方法的过程中出现异常,则该方法将"消耗"该异常,因此,如果代码在返回时没有中断,则将整个块封装在try-catch中,并在catch中放置一个断点,这样您就可以看到所得到的异常。