0

Ich habe diese Architektur in meinem Projekt und manchmal UI-Thread wird blockiert, kann jemand bitte erklären, was mit dem unten stehenden Code passiert. DankXamarin Async und warten: UI-Thread wird blockiert

Ich mache einen Service asynchron von xamarin.forms Ansichtsmodell

folgt dem Fluss

anzeigen ---> --- Ansichtsmodell KlasseA ---> ClassB - Machen Sie einen Service von hier

-Code

Szenario 1

public partial class HomePage : ContentPage 
{ 
    private HomeVM model; 

    public HomePage() 
    { 
     InitializeComponent(); 
     model = new HomeVM(); 
     model.MainText = ReturnBool().Result; 
     this.BindingContext = model; 
    } 
    public async Task<string> ReturnBool() 
    { 
     IsBusy = true; 
     var r = await new WS().ReturnBool(); 
     IsBusy = false;---------------------------------------Not hitting the breakpoint here 
     return r; 
    } 
} 

public interface IWS 
{ 
    Task<string> ReturnBool(); 
} 

public class WS : IWS 
{ 
    public Task<string> ReturnBool() 
    { 
     return ServiceOperations.ReturnBool(); 
    } 
} 

internal class ServiceOperations 
{ 
    public async static Task<string> ReturnBool() 
    { 
     var uri = new Uri(string.Format("http://testmyapi.azurewebsites.net/", string.Empty)); 
     try 
     { 
      HttpClient client = new HttpClient(); 
      client.BaseAddress = uri; 
      HttpResponseMessage response = null; 
      response = await client.GetAsync("/api/Values/Get"); 
      if (response.IsSuccessStatusCode) 
      { 
       var content = await response.Content.ReadAsStringAsync(); 
       string str = JsonConvert.DeserializeObject<string>(content); 
       return str; 
      } 
      else { 
       return null; 
      } 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

Szenario 2

public partial class HomePage : ContentPage 
{ 
    private HomeVM model; 

    public HomePage() 
    { 
     InitializeComponent(); 
     model = new HomeVM(); 
     this.BindingContext = model; 
    } 
} 

public class HomeVM : BaseVM 
{ 
    private string mainText; 

    public string MainText 
    { 
     get { return mainText; } 
     set 
     { 
      mainText = value; 
      RaisePropertyChanged("MainText"); 
     } 
    } 

    public HomeVM() 
    { 
     MainText = ReturnBool().Result; 
    } 

    public async Task<string> ReturnBool() 
    { 
     IsBusy = true; 
     var r = await new WS().ReturnBool(); 
     IsBusy = false;---------------------------------------Not hitting the breakpoint here 
     return r; 
    } 
} 


public interface IWS 
{ 
    Task<string> ReturnBool(); 
} 

public class WS : IWS 
{ 
    public Task<string> ReturnBool() 
    { 
     return ServiceOperations.ReturnBool(); 
    } 
} 

internal class ServiceOperations 
{ 
    public async static Task<string> ReturnBool() 
    { 
     var uri = new Uri(string.Format("http://testmyapi.azurewebsites.net/", string.Empty)); 
     try 
     { 
      HttpClient client = new HttpClient(); 
      client.BaseAddress = uri; 
      HttpResponseMessage response = null; 
      response = await client.GetAsync("/api/Values/Get"); 
      if (response.IsSuccessStatusCode) 
      { 
       var content = await response.Content.ReadAsStringAsync(); 
       string str = JsonConvert.DeserializeObject<string>(content); 
       return str; 
      } 
      else { 
       return null; 
      } 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 
} 
+0

'ReturnBool' wartet nicht auf den Anruf, nicht sicher, ob es den Task gerade durchschickt oder nicht mehr wartet. Andererseits, wenn es dort nie zu einem Breakpoint kommt, gibt es keine Antwort, aber es sollte nicht den Thread hängen. –

+0

Danke für Ihre Antwort, ich denke, es hängt warten, aber es gibt nie etwas zurück –

Antwort

2

Sie verwenden ReturnBool(). Im Konstruktor Ergebnis. Durch den Rückruf wird Ihr UI-Thread blockiert. Verschieben Sie diesen Code in die Controller-Aktionsmethoden, ohne den Teil ".Result" zu verwenden. Stellen Sie sicher, dass die Methoden asynchron sind und geben Sie immer eine Aufgabe zurück.

+0

Großartig, es hat funktioniert, Vielen Dank –

Verwandte Themen