2015-07-21 12 views
6

Moja metoda wywołuje usługę sieci Web i działa asynchronicznie.Jak zwrócić ciąg znaków z asynchronizatora

Kiedy otrzymuję odpowiedź, wszystko działa dobrze i otrzymuję odpowiedź.

Problem zaczyna się, gdy muszę zwrócić tę odpowiedź.

Oto kod mojego metody:

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

i wzywam to w ten sposób:

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

ale podczas drukowania wynik widzę coś takiego: System.Threading.Tasks.Task

jak mogę uzyskać ciąg wyniku, tak jak zrobiłem z danych wewnątrz mojej metody.

+1

Musisz uzyskać dostęp do właściwości 'Wynik' swojego' zadania', aby uzyskać pożądane wyjście. –

Odpowiedz

8

Trzeba to zrobić, ponieważ jesteś wywołanie metody asyncsynchronicznie:

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

myśleć o rodzaju Task<string> powrotnej jako „obietnicy”, aby powrócić do wartości w przyszłości.

Jeśli nazywa metodę transmisji asynchronicznej asynchronicznie to byłoby tak:

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

Nazwałem to asynchronicznie i działa, dzięki. Przyjmę to wkrótce. – eeadev

+1

Czekanie nie jest konieczne. Właściwość Wynik blokuje wywołujący wątek do momentu zakończenia zadania. Zobacz https://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx – Emile

+0

@Eile, masz rację! Zaktualizowałem odpowiedź. –

5

Metoda asynchroniczny zwraca zadanie, reprezentujący wartość przyszłą. W celu uzyskania rzeczywistej wartości owiniętą w tym zadaniu, należy go await:

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

Należy pamiętać, że będzie to wymagało metodę wywoływania być asynchroniczny. Jest to zarówno naturalne, jak i poprawne.