2016-10-27 9 views
4

Ich brauche ein wenig Hilfe, um mein Problem zu finden. Ich habe ASP.NET-Kern verwendet, und ich bin ziemlich vertraut damit, obwohl .NET Core C# scheint "crashing" und beim Versuch, meine asynchrone Anfrage zu machen.Async-Anfragen mit .NET-Core

Ich habe eine Methode, die die externe IP des Systems liefert

private async Task<string> getExternalIP() 
    { 
     using (System.Net.Http.HttpClient HC = new System.Net.Http.HttpClient()) 
     { 
      return await HC.GetStringAsync("https://api.ipify.org/"); 
     } 

    } 

Dies sollte funktionieren, aber es tritt aus, wenn er die HC.GetStringAsync erreicht. Ich habe auch versucht, einen Haltepunkt darauf zu setzen, aber es läuft nicht wirklich.

Ich versuche, die Methode aufzurufen, indem

string Address = await getExternalIP(); 

Jede Hilfe verwendet, ist dankbar, hoffentlich bin ich nicht nur etwas mit Blick auf.

Danke!

+0

Sie erhalten wahrscheinlich eine Ausnahme. – SLaks

+0

@SLaks Ich habe alle Ausnahmenbenachrichtigungen wieder aktiviert. Es wird keine Ausnahme ausgelöst. – Jaxi

+0

Verwenden Sie 'async void'? – SLaks

Antwort

7

Ihre vorgeschlagene Lösung ist überhaupt nicht gut.

  1. Es ist synchron
  2. Es Deadlock

Als Alternative dazu führen können, versuchen Sie diesen Ansatz:

private async Task<string> GetExternalIP() 
{ 
    using (HttpClient client = new HttpClient()) 
     return await client.GetStringAsync("https://api.ipify.org/"); 
} 

Ihre Rufmethode asynchron sein sollte:

public async Task CallingMethod() 
{ 
    // ... 
    string address = await GetExternalIP(); 
    // ... 
} 

Der Grund, warum es vorher nicht für Sie funktionierte, wurde durch die Verwendung von async void anstelle von async Task verursacht (erraten Sie dies durch die Kommentare).

async void ist eine asynchrone Methode, die nicht erwartet werden kann. Das heißt, du nennst es einfach und vergisst es. Sie werden keine Ausnahme fangen, Sie erhalten keinen Rückgabewert.

async Task ist eine erwartete asynchrone Methode, die nichts zurückgibt. Es ist das asynchrone Gegenstück für eine synchrone Methode void. Darüber hinaus können Sie auch jede Ausnahme abfangen, die bei asynchronem Code auftreten könnte.

+0

Ich hatte ursprünglich etwas ähnliches, aber das Problem ist die "CallingMethod" endet nicht zurück und die Anwendung beendet. Keine Ausnahme, keine Nachricht. – Jaxi

+0

@ProNinjaCat Weil du 'async void' und nicht' async Task' benutzt hast. Sie müssen CallingMethod() auch von jedem, der sie aufruft, abwarten. –

+0

Ich habe die async Task ausgeführt erwarten getExternalIP() und die getExternalIP() -Methode das gleiche, aber es wird immer noch nicht ausgeführt. – Jaxi

Verwandte Themen