2017-08-30 11 views
1

私はXamarin移植プロジェクトで自分のコードに問題があります。私のブール値フラグはイベントハンドラメソッドの前に実行されますが、私はこれを望ましくありません。イベントハンドラの後にコードを実行

静的Client.cs(唯一のWebサービスに接続する必要がありますクラス)アプリで

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; 
     } 

と私のログインページ:クラスが初期化されていませんIsConnectedClient

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); 
      } 
     } 

フラグ私のifステートメントの前に、イベントハンドラはいつでもどこでも実行します。

+0

イベントベースの非同期パターンとタスクベースの非同期パターンの間にブリッジを構築する必要があります。 https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/interop-with-other-asynchronous-patterns-and-types#EAP – Fildor

+1

ありがとう@Fildor あなたの返信は非常に役に立ちました – vamteusz

答えて

0

認証呼び出しを待つ必要があります。この方法では、認証が行われた後にLoginAsyncを呼び出すメソッドがさらに進み、IsConnectedをそれまでに更新する必要があります。

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

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

EventHandlerにフラグが設定されているため、これでは不十分です。 EAPとTAPの間には「ブリッジ」が必要です。 – Fildor

+0

はい、イベントハンドラにフラグが設定されています。しかし、私はそれが空を返すので、認証の呼び出しを待っています – vamteusz

+0

はい、あなたは - できます。 TaskCompletionSourceを使用します。 – Fildor

関連する問題