2015-06-20 83 views
0

提取返回任務數據的異步方法在C#中如何提取下面foreach循環從​​返回值的數據: 我在這裏無法提取返回值的數據。 我正在Windows 10通用應用程序開發中構建一個應用程序。如何在Windows 10

var response = NetworkingCalls.getResponseFromUrl(url, requestDictionary); 

foreach (KeyValuePair<string, object> item in response) 
{    
    Util.debugLog(item.Key.ToString(), item.Value.ToString()); 
} 

這是返回字典

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Windows.Storage.Streams; 
using Windows.Web.Http; 

namespace App2.WrittenLibraries 
{ 
    class NetworkingCalls 
    { 
     public async static Task<Dictionary<string, object>> getResponseFromUrl(string urlString, Dictionary<string, object> requestDictionary) 
     { 
      var client = new HttpClient(); 
      Uri url = new Uri(urlString); 
      var requestToSend = JSONParser.getJsonString(requestDictionary); 
      HttpResponseMessage response = await client.PostAsync(url, new HttpStringContent(requestToSend, 
                          UnicodeEncoding.Utf8, 
                          "application/json")); 
      if (response.IsSuccessStatusCode) 
      { 
       try 
       { 
        var responseString = await response.Content.ReadAsStringAsync();  
        client.Dispose(); 
        return JSONParser.getDictionary(responseString); 
       } 
       catch (Exception ex) 
       { 
        client.Dispose(); 
        return new Dictionary<string, object>(); 
       } 
      } 
      else 
      { 
       client.Dispose(); 
       return new Dictionary<string, object>(); 
      } 
     } 
    } 
} 
+0

請不要永遠不要'catch(Exception ex)' - 這是一個糟糕的編程習慣。 – Enigmativity

+0

感謝您的建議,如果您提出其他好的方法,我會更有幫助。 – djkp

+0

@javvajikiran - 簡單地不抓住'Exception' - 只捕獲您可能發生的可以從中恢復的特定異常。否則,不要抓住他們。你的代碼目前隱藏了錯誤,使你的代碼錯誤並且很難修復。 – Enigmativity

回答

3

您需要await任務在async方法型號代碼:

async Task FooAsync() 
{ 
    var response = await NetworkingCalls.getResponseFromUrl(url, requestDictionary); 

    foreach (KeyValuePair<string, object> item in response) 
    {    
     Util.debugLog(item.Key.ToString(), item.Value.ToString()); 
    } 
} 

如果你方法不能async你可以用task.Resulttask.GetAwaiter().GetResult()得到結果,但這應該是最後的手段,因爲它阻止了呼叫線程同步而不是異步等待:

void Foo() 
{ 
    var response = NetworkingCalls. 
     getResponseFromUrl(url, requestDictionary). 
     GetAwaiter(). 
     GetResult(); 

    foreach (KeyValuePair<string, object> item in response) 
    {    
     Util.debugLog(item.Key.ToString(), item.Value.ToString()); 
    } 
} 
+0

以這種方式實施後,應用程序遭到了攻擊。 – djkp

+0

回答者提到了兩種不同的方法。您需要指定您使用的方法。如果你使用第二種方法,你可能會陷入僵局。在所有「異步」方法中使用「等待」。 – BTownTKD

+0

非常感謝它工作:)第一種方法 – djkp