2015-07-21 2 views
6

Мой метод вызывает веб-сервис и работает асинхронно.Как вернуть строку из async

При получении ответа все работает нормально, и я получаю ответ.

Проблема начинается, когда мне нужно вернуть этот ответ.

вот код моего метода:

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

вам нужно получить доступ к свойству 'Result' вашей' Задачи', чтобы получить желаемый результат. –

ответ

8

Вы должны сделать это, так как вы вызываете метод asyncсинхронно:

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

Думай типа Task<string> возвращения как «обещание», чтобы вернуть значение в будущем.

Если вы вызвали метод асинхронного асинхронно, то это будет похоже на следующее:

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

@ Верьте, что вы правы! Я обновил ответ. –

5

асинхронный метод возвращает задачу, представляющих будущей стоимости. Для того, чтобы получить фактическое значение, завернутые в решении этой задачи, вы должны await его:

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

Обратите внимание, что это потребует вашего вызова метода быть асинхронными. Это естественно и правильно.