2017-08-30 35 views
1

Ich habe ein Problem mit meinem Code in einem Xamarin tragbaren Projekt. Mein boolesches Flag wird vor der Event-Handler-Methode ausgeführt, aber das möchte ich nicht.Code nach Ereignishandler

statische Client.cs (Klasse, die nur mit Web-Service verbinden soll)

public static bool IsConnected; 
private static string _username; 
private static string _password; 
private static void Login() 
{ 
     // all login procedures 
     Connection.ServiceUserAuthorisationCompleted +=  UserAuthorisationCompleted; 
     Connection.ServiceUserAuthorisationAsync(_login, _password); 
} 
private static void UserAuthorisationCompleted(object sender, ServiceUserAuthorisationCompletedEventArgs e) 
     { 
      IsConnected = e.Result.status.Equals("1"); 
     } 
public static Task LoginAsync(string username, string password) 
     { 
      _username = username; 
      _password = password; 

      var task = new Task(Login); 
      task.Start(); 

      return task; 
     } 

und meine Login-Seite in App:

private async void SignInClicked(object sender, EventArgs e) 
     { 
      var login = Login.Text; 
      var password = Password.Text; 

      await Client.LoginAsync(login, password); 
      if (Client.IsConnected) 
      { 
       MyCredentials.SaveCredentials(login, password); 
      } 
     } 

Flagge IsConnected in Client Klasse nicht initialisiert vor meiner if Anweisung, also der Event-Handler führt immer nach, wo ich will.

+0

Sie müssen hier eine Brücke zwischen Event-based Async Pattern und Taskbased Async Pattern bauen. Siehe https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/interop-with-other-asynchronous-patterns-and-types#EAP – Fildor

+1

dank @Fildor Ihre Antwort war sehr hilfreich – vamteusz

Antwort

0

Sie sollten die Genehmigung Anruf erwarten, auf diese Weise das Verfahren nach der Zulassung geht LoginAsync Aufruf weiter passiert und IsConnected sollte dann aktualisiert werden.

public static async Task LoginAsync(string username, string password) 
{ 
    _username = username; 
    _password = password; 

    Connection.ServiceUserAuthorisationCompleted += UserAuthorisationCompleted; 
    await Connection.ServiceUserAuthorisationAsync(_login, _password); 
} 
+0

Das ist wahrscheinlich nicht genug, da das Flag im EventHandler gesetzt ist. Es muss eine "Brücke" zwischen EAP und TAP geben. – Fildor

+0

Ja, Flag wird im Event-Handler gesetzt. allerdings kann ich nicht auf den autorisierungsaufruf warten, weil es void zurückgibt – vamteusz

+0

Ja, Sie können - in gewisser Weise. Mit TaskCompletionSource. – Fildor