簡體   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