在遗留应用程序中,我们有一个 winform,它在单击按钮时执行代码时锁定……好吧,它不会锁定,它只是“停止响应”,直到代码执行。
将下面的代码包装到单独的线程中并在执行时显示加载窗口 (frmLoading) 的最佳(最少代码量和工作)方法是什么?我知道这应该相对简单,但我尝试了一些不同的方法,但都不太奏效。
private void btnSynch_Click(object sender, EventArgs e)
{
btnSynch.Enabled = false;
if(chkDBSynch.Checked)
PerformDBSyncronization();
if(chkAppSynch.Checked)
PerformApplicationSyncronization();
btnSynch.Enabled = true;
}
编辑: 好的,我应该提到已经尝试过 backgroundworker,但我想出了我在哪里绊倒了....这段代码将执行并且加载表单被抛在主表单后面,这就是我认为它不起作用的原因。谁能告诉我如何防止这种情况发生?
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();
关于c# - 简单的加载形式/线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682185/