2016-11-03 22 views
-4

Ich bin nicht vertraut mit Threading in .NET.So rufen Sie eine asynchrone Methode auf?

Ich habe eine ansync Methode MyTest:

public async Task MyTest() { 
    using (HttpClient httpClient = new HttpClient()) { 
     httpClient.BaseAddress = new Uri(_uri); 

     var response = await httpClient.GetAsync("API/GetData"); 

     if(response!=null && response.IsSuccessStatusCode) { 
      var json = await response.Content.ReadAsStringAsync(); 
      return JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 
     } 
    } 
} 

Das Problem, das ich in laufen lasse, um die Methode aufrufen, die Ergebnisse (Dictionary) zu erhalten.

Wenn ich Schritt obwohl mein Code, den ich die IsCompleted sehe, bevor die Ergebnisse kommen aus meiner Ruhe Rückruf erfolgt.

Wie Threading ich richtig in diesem Fall benutzen?

Meine Methode zum Aufrufen der asynchronen Methode.

public void GetTestData() 
{ 
    try 
    {     
     ARestService rest = new ARestService(); 
     Task tsk = new Task(rest.MyTest); 
     if (tsk.IsCompleted) 
     { 
      var tst = "Done?"; 
     } 
    } 
    catch(Exception ex) 
    { 
     string a = ex.Message; 
    } 
} 
+0

Bitte, fühlen Sie sich frei, einige Tutorials auf async/erwarten zu lesen, anstatt sich durch die Dunkelheit zu fummeln. –

+1

Mögliches Duplikat von [Wie asynchroner Methode von synchroner Methode in C# nennen?] (Http://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c) – meJustAndrew

+0

Ruf es einfach an und warte auf das Ergebnis. Oder warte direkt darauf. Die Methode ist asynchron, weil **. ReadAsStringAsync ** bereits asynchron ist und im Hintergrund ausgeführt wird. Die Methode gibt eine bereits laufende Aufgabe zurück, die Sie nur erwarten müssen –

Antwort

0

Wenn Sie Ihr GetTestData Methode in eine async Methode einfach tun dies machen kann.

public async Task GetTestData() 
{ 
    try 
    {     
     ARestService rest = new ARestService(); 
     await rest.MyTest(); 
     var tst = "Done?"; 
    } 
    catch(Exception ex) 
    { 
     string a = ex.Message; 
    } 
} 

Sie sollten auch festlegen, dass Ihre Methode ein Task<Dictionary<string, string>> gibt das Ergebnis Ihres Rest-Service-Aufruf, mit der folgenden Aussage zu erhalten.

Dictionary<string, string> dict = await rest.MyTest(); 

Wenn nicht, haben einen Blick auf einige Workarounds, wie GetAwaiter().GetResult() verwenden, aber wie in dieser Frage Is .GetAwaiter().GetResult(); safe for general use? es kann dazu führen, einige Probleme, so ist die beste Option, um Ihre Berufung Code zu machen async zu erklären.

+1

Zuerst verstecken Sie mögliche Ausgaben. Zweitens geht es bei der anderen Frage um "async void" * nur *. Sie können einfach '.Result' auf dem Rückgabewert aufrufen, wenn Sie synchron blockieren möchten –

+0

Guter Punkt! Ich erkannte, dass die Verbindung nicht genau das gleiche Szenario ist. Ich habe selten die 'GetAwaiter(). GetResult()' 'Abhilfe nur in Konsolenanwendungen verwendet. – jorgonor

Verwandte Themen