如何在主应用程序工作时显示对话框表单?

时间:2012-07-07 10:03:08

标签: c# winforms multithreading

我想在主应用程序连接到db并获取初始数据时显示一个加载表单。因为这可能需要5-10秒,我想通知用户发生了什么事情。

这就是我的想法:

frmStart _frmStart = new frmStart();
Thread t = new Thread(() => _frmStart.ShowDialog());
t.Start();
objDAL = new DBManager();
objDAL.conSTR = Properties.Settings.Default.conDEFAULT;
PrepareForm();
t.Abort();

这是最好的方式吗?

2 个答案:

答案 0 :(得分:2)

不,这并没有解决冻结的UI问题,它只是将其结束。不完美的是,对话框的父对象是桌面,可以很容易地显示在冻结窗口下面,因此根本不可见。并且对话框不是常规窗口的模态,因为它在另一个线程上运行。用户开始单击非响应窗口时的失败模式非常难看,当UI线程恢复活动时,这些点击都会被调度。

有解决方法(你必须自己调整SetParent并禁用主窗口),但这只是解决了错误的问题。你永远不应该让UI线程阻塞超过一秒钟。使用BackgroundWorker完成繁重的工作,使用RunWorkerCompleted事件处理程序中的查询结果更新表单。

答案 1 :(得分:1)

如果您使用的是WinForms,可能需要查看此A Pretty Good Splash Screen in C#。如果您使用WPF,可以查看此Implement Splash Screen with WPF