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