我的 WinForms 应用程序的主窗口加载速度很慢(最多 20 秒,具体取决于参数),因此它需要启动屏幕。
主窗口构造函数很慢,因为它执行了数千行代码(其中一些超出了我的影响)。有时此代码会弹出消息框。
我尝试了两种启动画面设计,它们都有问题。有更好的想法吗?
带有 BackgroundWorker 的启动画面
static void Main(string[] args)
{
var splash = !args.Contains("--no-splash");
if (splash)
{
var bw = new BackgroundWorker();
bw.DoWork += (sender, eventArgs) => ShowSplash();
bw.RunWorkerAsync();
}
var app = new FormMain(args); // slow. sometimes opens blocking message boxes.
Application.Run(app);
}
private static void ShowSplash()
{
using (var splash = new FormSplash())
{
splash.Show();
splash.Refresh();
Thread.Sleep(TimeSpan.FromSeconds(2));
}
}
问题:
- 启动画面有时会在主窗口打开之前过期(用户认为应用程序已崩溃)
- 飞溅关闭时,主窗口有时会最小化。
带有 WindowsFormsApplicationBase 的启动画面
sealed class App : WindowsFormsApplicationBase
{
protected override void OnCreateSplashScreen()
{
this.SplashScreen = new FormSplash();
}
protected override void OnCreateMainForm()
{
// slow. sometimes opens blocking message boxes.
this.MainForm = new FormMain(this.CommandLineArgs);
}
}
问题:
- 任何打开的 MessageBoxes 都会默默地出现在启动屏幕后面。用户不会注意到它并认为应用程序卡住了。
- 如果启动画面“始终在顶部”,则消息框不可访问且不可点击。