2017-08-30 56 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; 
     } 

和我的登錄頁面:

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

標誌IsConnectedClient類未初始化在我的if語句之前,所以事件處理程序總是在我想要的地方執行。

+0

您需要在此處構建基於事件的異步模式和Taskbased異步模式之間的橋樑。請參閱https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/interop-with-other-asynchronous-patterns-and-types#EAP – Fildor

+1

謝謝@Fildor 您的回覆非常有幫助 – vamteusz

回答

0

您應該等待授權調用,這樣調用Lo​​ginAsync的方法將在您的授權發生後進一步進行,並且在此之前應該更新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

相關問題