【发布时间】:2011-04-15 20:44:13
【问题描述】:
在旧版应用程序中,我们有一个单一的 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;
}
【问题讨论】:
-
您是否需要知道何时完成,或者这是“一劳永逸”的场景?
-
@Richard DesLonde - 我不需要知道它什么时候完成,只需要告诉用户表单没有“冻结”。
标签: c# winforms multithreading