在遗留应用程序中,我们只有一个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;
}
答案 0 :(得分:2)
我觉得很傻......主要形式后面出现了装载形式,这就是为什么我认为它没有打开。我将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();
答案 1 :(得分:0)
为此目的使用BackgroundWorker。