如何从BackgroundWorker获取更新.DoWork事件

本文关键字:更新 DoWork 事件 获取 BackgroundWorker | 更新日期: 2023-09-27 18:05:52

在我的登录窗口中,当我单击登录按钮时,将执行配置和登录过程,这些方法位于另一个类文件中。到目前为止,我所取得的成就是,当我点击登录按钮时,加载动画将显示在登录窗口的顶部,这些进程也将被执行。在配置类文件中有一些登录错误检查,所以当登录错误被捕获时,将提示出一个带有相关信息的消息框并停止登录过程,问题是消息框不会提示出来,因为我把那些配置和登录过程放在BackgroundWorker中。DoWork事件。

login . example .cs的代码:

 private void LoginBtn_Click(object sender, RoutedEventArgs e) 
 {
   Loading.Visibility = Visibility.Visible; //The loading animation
   Loading.Visibility = Visibility.Visible;
   Cursor = Cursors.Wait;
   bw.DoWork += new DoWorkEventHandler(LoginInfoVerification);
   bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
   bw.WorkerReportsProgress = true;
   bw.RunWorkerAsync();
 }
private void LoginInfoVerification(object sender, DoWorkEventArgs e) {
  var loginInfoVerification = config.ServerConnection(loginInfo.userName,
    loginInfo.galPassword, loginInfo.place,
    loginInfo.host, loginInfo.port,
    loginInfo.application);
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  if (GlobalVariables.loginSuccess == true) 
  {
    //Pass these variables to main window
    var mainWindow = new MainWindow(loginInfo.userName, loginInfo.place, loginInfo.host, loginInfo.port,
                                    loginInfo.application);
    mainWindow.Show(); 
    this.Close();
  } 
  else
    Loading.Visibility = Visibility.Collapsed;
  Cursor = Cursors.Arrow;
}
Configuration.cs

:

public Configuration ConfigServerConnection(string loginUserName, string loginPassword, string loginPlace, string loginHost, int loginPort, string loginApplication)
{
  //Server connection
  //Login info verification
  //If login error caught, prompt message box, different errors, different message
 }

对于我的情况,是否有更好的建议同时处理UI更新和流程更新?请帮助。

如何从BackgroundWorker获取更新.DoWork事件

要显示消息框,您需要使用Dispatcher.Invoke切换回UI线程,参见此

Application.Current.Dispatcher.Invoke(() => /* show appropriate message box */);

或者,如果你使用。net 4.5或更高版本,你可以通过用async关键字标记LoginBtn_Click,然后等待登录过程,使async-await更容易。

如果有一个异步版本的ServerConnection返回一个任务,你可以使用await,否则你可以使用Task.Run()在线程池线程上执行ServerConnection

Await将异步地启动登录操作,一旦完成,将恢复GUI线程上方法的其余部分,因此您可以在不使用Dispatcher.Invoke的情况下操作GUI组件。

private async void LoginBtn_Click(object sender, RoutedEventArgs e) 
 {
   Loading.Visibility = Visibility.Visible; //The loading animation
   Loading.Visibility = Visibility.Visible;
   Cursor = Cursors.Wait;      
   LoginVerification loginInfoVerification = null;
   await Task.Run(() =>
                 {
                     loginInfoVerification = config.ServerConnection(loginInfo.userName, 
                                                                     loginInfo.galPassword, 
                                                                     loginInfo.place, 
                                                                     loginInfo.host, 
                                                                     loginInfo.port, 
                                                                     loginInfo.application);
                 });   
      .. rest of code, check login success, show message box..
 }