2015-07-21 24 views
6

Meine Methode ruft einen Webdienst auf und arbeitet asynchron.So geben Sie eine Zeichenfolge von async zurück

Wenn Antwort, alles funktioniert gut und ich bekomme meine Antwort.

Das Problem beginnt, wenn ich diese Antwort zurückgeben muss.

hier ist der Code meiner Methode:

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

und ich es so nenne:

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

aber beim Drucken Ergebnis, das ich so etwas wie dieses sehe: System.Threading.Tasks.Task

Wie kann ich die Ergebniszeichenfolge wie ich mit Daten innerhalb meiner Methode erhalten.

+1

müssen Sie auf die 'Result'-Eigenschaft Ihrer' Task' zugreifen, um die gewünschte Ausgabe zu erhalten. –

Antwort

8

Sie müssen dies tun, da Sie die async Methode rufen synchron:

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

Denken Sie an die Task<string> Rückgabetyp als ‚Versprechen‘ einen Wert in der Zukunft zurückkehren.

Wenn Sie die Async Methode asynchron dann aufgerufen, wäre es wie folgt sein:

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

Ich nannte es async, und es funktioniert, danke. Ich werde es bald akzeptieren. – eeadev

+1

Das Warten ist nicht notwendig. Die Eigenschaft Result blockiert den aufrufenden Thread, bis der Task beendet ist. Siehe https://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx – Emile

+0

@Emile Sie sind richtig! Ich habe die Antwort aktualisiert. –

5

Eine asynchrone Methode gibt eine Aufgabe, was einen zukünftigen Wert. Um den tatsächlichen Wert in dieser Aufgabe eingewickelt zu bekommen, sollten Sie es await:

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

Beachten Sie, dass dies Ihr Aufruf der Methode asynchron sein erfordert. Dies ist sowohl natürlich als auch korrekt.

Verwandte Themen