在遗留应用程序中,我们有一个winform,在按钮单击时执行代码时锁定…好吧它不会锁定它只是“停止响应”,直到代码执行.
将下面的代码包装到一个单独的线程并在执行时显示加载窗口(frmloading)的最佳方法(最少量的代码和工作方式)是什么?我知道这应该相对简单,但我尝试了一些尚未完成的不同事情.
private void btnSynch_Click(object sender,EventArgs e) { btnSynch.Enabled = false; if(chkDBSynch.Checked) PerformDBSyncronization(); if(chkAppSynch.Checked) PerformApplicationSyncronization(); btnSynch.Enabled = true; }
编辑:
好吧,我应该提到尝试过背景工作者,但是我想出了我在绊倒的地方……这段代码会执行,加载表格会被抛到主表单后面,这就是为什么我认为它不起作用.谁能告诉我如何防止这种情况发生?
private void btnSynch_Click(object sender,EventArgs e) { btnSynch.Enabled = false; frmloading loadingWindow = new frmloading(); loadingWindow.Show(); BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s,args) => { Thread.Sleep(6000); //Todo:just for testing if(chkDBSynch.Checked) PerformDBSyncronization(); if(chkAppSynch.Checked) PerformApplicationSyncronization(); }; bw.RunWorkerCompleted += (s,args) => { loadingWindow.Close(); }; bw.RunWorkerAsync(); btnSynch.Enabled = true; }
解决方法
我觉得很傻……主要形式后面出现了装载形式,这就是为什么我认为它没有打开.我将TopMost属性设置为true,一切都按预期工作.
编辑:
这是一个很好的解释为什么我的窗体弹出我的窗口,我只是没想到打开窗口的线程不使用主窗体作为所有者.
Why use a owner window in MessageBox.Show?
我最终得到的代码看起来像
frmloading loadingWindow = new frmloading(); loadingWindow.Show(this); BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s,args) => { this.Invoke(new MethodInvoker(() => this.Enabled = false)); if(chkDBSynch.Checked) PerformDBSyncronization(); if(chkAppSynch.Checked) PerformApplicationSyncronization(); }; bw.RunWorkerCompleted += (s,args) => { loadingWindow.Close(); this.Invoke(new MethodInvoker(() => this.Enabled = true)); }; bw.RunWorkerAsync();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。