2017-08-30 58 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

相关问题