2015-07-21 45 views
6

我的方法正在調用Web服務並以異步方式工作。如何從異步中返回字符串

當得到迴應時,一切正常,我得到我的迴應。

當我需要返回此響應時,問題就開始了。

這裏是我的方法的代碼:

public async Task<string> sendWithHttpClient(string requestUrl, string json) 
     { 
      try 
      { 
       Uri requestUri = new Uri(requestUrl); 
       using (var client = new HttpClient()) 
       { 
        client.DefaultRequestHeaders.Clear(); 
        ...//adding things to header and creating requestcontent 
        var response = await client.PostAsync(requestUri, requestContent); 

        if (response.IsSuccessStatusCode) 
        { 

         Debug.WriteLine("Success"); 
         HttpContent stream = response.Content; 
         //Task<string> data = stream.ReadAsStringAsync();  
         var data = await stream.ReadAsStringAsync(); 
         Debug.WriteLine("data len: " + data.Length); 
         Debug.WriteLine("data: " + data); 
         return data;      
        } 
        else 
        { 
         Debug.WriteLine("Unsuccessful!"); 
         Debug.WriteLine("response.StatusCode: " + response.StatusCode); 
         Debug.WriteLine("response.ReasonPhrase: " + response.ReasonPhrase); 
         HttpContent stream = response.Content;  
         var data = await stream.ReadAsStringAsync(); 
         return data; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine("ex: " + ex.Message); 
       return null; 
      } 

和我打電話這樣說:

 Task <string> result = wsUtils.sendWithHttpClient(fullReq, "");   
     Debug.WriteLine("result:: " + result); 

但打印結果,當我看到這樣的事情:System.Threading.Tasks.Task

我怎麼能得到結果字符串,因爲我在我的方法中使用了數據

+1

您需要訪問Task的'Result'屬性才能獲得所需的輸出。 –

回答

8

你需要這樣做,因爲你所呼叫的async方法同步:在Task<string>返回類型的

Task<string> result = wsUtils.sendWithHttpClient(fullReq, "");   
    Debug.WriteLine("result:: " + result.Result); // Call the Result 

覺得作爲一個「承諾」在未來返回一個值。

如果您呼叫的異步方法異步那麼這將是這樣的:

string result = await wsUtils.sendWithHttpClient(fullReq, "");   
    Debug.WriteLine("result:: " + result); 
+1

我稱之爲異步,它的工作原理,謝謝。我會盡快接受。 – eeadev

+1

等待是沒有必要的。 Result屬性阻塞調用線程直到任務完成。請參閱https://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx – Emile

+0

@Emile你是對的!我更新了答案。 –

5

異步方法返回一個任務,代表未來價值。爲了得到包裹在該任務的實際值,你應該await它:

string result = await wsUtils.sendWithHttpClient(fullReq, ""); 
Debug.WriteLine("result:: " + result); 

注意,這將需要您的調用方法是異步的。這是既自然又正確的。