异步方法跳过等待

本文关键字:等待 异步方法 | 更新日期: 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中放置一个断点,这样您就可以看到所得到的异常。