如何从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更新和流程更新?请帮助。
要显示消息框,您需要使用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..
}