2016-06-29 6 views
4

Ich arbeite an einer Android-Anwendung, die von einer ASP.NET Core-Anwendung auf Azure gehostet wird. Ich verwende ein gemeinsam genutztes Bibliotheksprojekt, um grundlegende Funktionen in einem Konsolenanwendungsprojekt zu testen, bevor ich die Funktionen für das Xamarin.Forms-Projekt (nur für Android) herstelle.
Code Das folgende Stück nach Einloggen in den Web-Service ausgeführt wird, wo Client ein HttpClient ist:HttpClient.GetAsync kehrt nie auf Xamarin.Android zurück

public static async Task<MyClass> GetInformationAsync(string accountId) 
{ 
    HttpResponseMessage response = await Client.GetAsync(UriData + "/" + accountId); 
    response.EnsureSuccessStatusCode(); 
    string responseContent = await response.Content.ReadAsStringAsync(); 
    return JsonConvert.DeserializeObject<MyClass>(responseContent); 
} 

Unter dem gleichen Computer/Netzwerk, beendet der Code in weniger als eine Sekunde auf der Konsolenanwendung es endet jedoch nie (sogar eine Minute gewartet) in dem Projekt Xamarin.Forms.Android.
Ich finde das komisch, da sich der Android-Client erfolgreich mit PostAsync am Web-Service anmelden kann.

Es gibt jedoch einen Unterschied, wie der Android-Client und der Console-Client GetInformationAsync aufrufen.

Während die Konsolen-Client ruft sie asynchron:

private static async void TestDataDownload() 
{ 
     ... 
     var data = await WebApiClient.GetInformationAsync(myId); 
} 

Der Android-Client es synchron

public void MainPage() 
{ 
     ... 
     var data = WebApiClient.GetInformationAsync(myId).Result; 
} 
+0

Sind Sie lokale Host oder lokale IP-Adresse verwenden? –

+0

@AthulHarikumar der Web-Service wird auf einer kostenlosen Instanz von Azure Web Apps gehostet –

Antwort

8

Es ruft scheint, wie Sie ein Deadlock irgendeiner Art erleben. Vielleicht möchten Sie den Code, wo Sie tatsächlich anrufen GetInformationAsync, da es wahrscheinlich ist, wo die Problemquelle ist.

Sie können sich wahrscheinlich Ihr Problem beheben, indem Sie:

  1. Nicht GetInformationAsync in einem Sync-Weg Aufruf
  2. Ihre Asynchron-Anrufe in GetInformationAsync mit ConfigureAwait(false) Postfixing nicht Kontext auf jedem Methodenaufruf zu wechseln.

So Ihre GetInformationAsync Methode würde wie folgt aussehen:

public static async Task<MyClass> GetInformationAsync(string accountId) 
{ 
    var response = await Client.GetAsync(UriData + "/" + accountId).ConfigureAwait(false); 
    response.EnsureSuccessStatusCode(); 
    var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
    return JsonConvert.DeserializeObject<MyClass>(responseContent); 
} 

Dann, wenn Sie es irgendwo rufen Sie es brauchen, um wieder auf dem gleichen Kontext zurückzukehren, das heißt wenn Sie UI aktualisieren müssen:

var myClass = await GetInformationAsync(accountId); 
// update UI here... 

Andernfalls, wenn Sie auf dem gleichen Kontext nicht zurückgeben müssen tun:

var myClass = await GetInformationAsync(accountId).ConfigureAwait(false); 
+0

Aufruf von GetInformationAsync auf eine asynchrone Weise funktioniert, ohne die Änderungen an GetInformationAsync selbst. Vielen Dank! –

+1

ConfigureAwait (false) Funktioniert für mich. Vielen Dank! –

Verwandte Themen