2015-07-21 21 views
6

Benim yöntemim bir web servisi çağırıyor ve eşzamansız çalışıyor.Bir dizgeyi async'den döndürme

Yanıt alırken her şey iyi çalışıyor ve yanıtımı alıyorum.

Bu yanıtı geri vermem gerektiğinde sorun başlıyor. Burada

yöntemimin kodudur:

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; 
      } 

ve ben bu şekilde sesleniyorum:

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

ama böyle bir şey görüyorum sonucu yazdırırken: System.Threading.Tasks.Task

Yöntemimin içinde veri ile yaptığım gibi sonuç dizesini nasıl alabilirim. Task<string> dönüş türü

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

Think gelecekte bir değer döndürmek için bir 'sözünü' olarak: Eğer eşzamanlıasync yöntemini çağırarak beri

+1

İstenen çıktıyı almak için 'Görevinizin' Sonuç property özelliğine erişmeniz gerekir. –

cevap

8

Bunu yapmak gerekir. zaman uyumsuz sonra zaman uyumsuz yöntemini denilen Eğer

aşağıdaki gibi olacaktır:

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

Async'i aradım ve işe yarıyor. Yakında kabul edeceğim. – eeadev

+1

Beklemek gerekli değil. Sonuç özelliği, görev sona erene kadar çağıran iş parçacığını engeller. Https://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx – Emile

+0

@Emile Haklısınız! Cevabı güncelledim. –

5

Zaman uyumsuz yöntem gelecek değerini temsil eden bir görevi döndürür. bu görevin sarılmış gerçek değeri elde etmek için, bunu await olmalıdır: Bu asenkron olmak için çağrıda yöntemi gerektireceğini

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

Not. Bu hem doğal hem de doğrudur.