2014-10-20 136 views
0

我有以下代碼:異步方法跳過等待

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的值爲空。

爲什麼會發生這種情況? 謝謝。

PS:我在調用此方法是這樣的:

StringBuilder的strBuild =新的StringBuilder();

foreach (var image in imageApiUrlLst) 
{ 
    string imageModelPull = await callMgr.GetData(new Uri(image)); ///WHY GETS STUCK! 
    strBuild.AppendLine(imageModelPull); 
    } 
+0

當我複製你的代碼時適合我。 (假設client = WebClient) – 2014-10-20 03:33:07

+0

這是設計的..記住,你不會從你的方法中返回'strResult',即'string'。這種方法的返回類型是'任務' ..研究更多關於異步等待如何工作,以及它是什麼意思..否則它將是一個覆蓋在答案中的太廣泛的主題,或者必須已經在,我敢打賭。 – 2014-10-20 04:13:57

+0

我也試過返回rskResult,問題是根據調試器(我使用Xamarin)調用此方法,但沒有任何結果。調試器不會跳出這個方法。 – RealityDysfunction 2014-10-20 04:34:49

回答

1

async方法儘快返回作爲await語句達到,如果期待已久的事情還沒有完。一旦完成,該方法在該陳述後繼續執行。嘗試在返回語句上放置一個斷點,並且它應該被擊兩次。

0

aysnc將該方法標記爲異步。當呼叫結果回來時,執行將繼續執行。

當您提出請求以獲取tskResult執行時,無法完成以下步驟,因爲執行必須等待(可能有許多時鐘週期),因此在首次放下標記後應該返回該標記的位置時跳過此方法。

當DownloadStringTaskAsync已完成時,它將回到此方法,然後分配一個結果。在調用啓動後,實時數據可能會達到數百萬個CPU時鐘週期,您只需一次調試一行,就可以看到跳轉,然後回調。

讓你在返回strResult時斷點並且不要通過。在client.DownloadStringTaskAsync返回後,等待該呼叫回來。

此外,如果在此方法的執行過程中出現異常,則該方法將「消耗」,因此如果代碼沒有在您的返回中斷,則將整個塊封裝在try catch中,並將一個斷點在捕獲的內部 - 所以你可以看到你得到了什麼異常。