2015-07-21 18 views
6

Phương thức của tôi đang gọi dịch vụ web và hoạt động không đồng bộ.Cách trả về chuỗi từ async

Khi nhận được phản hồi, mọi thứ hoạt động tốt và tôi nhận được phản hồi của tôi.

Sự cố bắt đầu khi tôi cần trả lại phản hồi này.

đây là mã của phương pháp của tôi:

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

và tôi gọi nó theo cách này:

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

nhưng khi in kết quả tôi nhìn thấy một cái gì đó như thế này: System.Threading.Tasks.Task

làm thế nào tôi có thể nhận được chuỗi kết quả như tôi đã làm với dữ liệu bên trong phương pháp của tôi.

+1

bạn cần truy cập thuộc tính 'Result' của' Tác vụ' để có được kết quả mong muốn. –

Trả lời

8

Bạn cần phải làm điều này vì bạn đang gọi phương thức asyncđồng bộ:

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

Hãy suy nghĩ về các loại Task<string> trở lại như một 'lời hứa' để trả về một giá trị trong tương lai.

Nếu bạn gọi là phương pháp async không đồng bộ thì nó sẽ là như sau:

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

Tôi gọi nó là không đồng bộ, và nó hoạt động, cảm ơn. Tôi sẽ chấp nhận nó sớm thôi. – eeadev

+1

Việc chờ đợi là không cần thiết. Thuộc tính Result sẽ khóa luồng gọi cho đến khi tác vụ kết thúc. Xem https://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx – Emile

+0

@Emile bạn là chính xác! Tôi đã cập nhật câu trả lời. –

5

Một phương pháp không đồng bộ trả về một nhiệm vụ , đại diện cho một giá trị tương lai . Để có được giá trị thực tế được bọc trong nhiệm vụ đó, bạn nên await nó:

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

Lưu ý rằng điều này sẽ đòi hỏi phương pháp của bạn gọi là không đồng bộ. Điều này là cả tự nhiên và chính xác.

Các vấn đề liên quan