Updated这是我遇到的一个有趣的问题。我需要在后台进程运行时显示进度对话框。通常,这可行,但问题是我需要在后台进程中设置公共静态数据。这是我试图完成的示例:
public partial class MainWindow : Window
{
public static Service binding;
public static Result lr;
public progressDialog dlg;
private void login()
{
string sPwd = txtPwd.Password;
string sEmail = txtEmail.Text;
binding = new Service();
lr = binding.login(sEmail, sPwd);
}
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted)
worker.RunWorkerAsync();
dlg = new progressDialog();
dlg.Show();
login();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = login();
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Hid();
Window1 newWindow = new Window1();
newWindow.Show();
dlg.Close();
}
我知道,就目前情况而言,它不会起作用,因为 login() 是一个 void,并且实际上不会返回与 DoWork 事件中的 e.Result 一起使用的值。但是,我已经设置了一个登录类来传递参数,但我仍然收到错误,指出我无法访问 UI 线程。主要问题是 lr 和绑定由另一个窗口访问,因此它们必须是公共静态数据(从另一个窗口我设置 public static Service binding = MainWindow.binding;)。我只是不太明白如何设置它。
你思考这个问题的方式是错误的。
您需要在主线程上显示进度对话框,而不是在后台工作线程中显示进度对话框。
然后,在BackgroundWorker.DoWork 处理程序中,您可以完成实际工作。这在后台线程中运行。
当您的工作正在进行时,请定期致电后台工作人员.ReportProgress。这会将 UI 线程上的进度推至均匀状态。
您会想要订阅BW.ProgressChanged事件,您将在此处更新进度对话框中的进度栏。这会在 UI 线程上自动发生。
您的工作以及对 ReportProgress 的调用必须是 DoWork 事件处理程序中的唯一内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)