0

我希望在主应用程序连接到数据库并获取初始数据时显示一个加载表单。因为这可能需要 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();

这是最好的方法吗?

4

2 回答 2

2

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

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

于 2012-07-07T10:49:15.997 回答
1

如果您使用的是 WinForms,您可能想看看这个A Pretty Good Splash Screen in C#。如果您使用的是 WPF,您可以查看这个使用 WPF实现启动画面

于 2012-07-07T10:10:01.840 回答