Windows桌面应用程序的多线程启动屏幕的设计技巧
2009-10-24 00:00:00 来源:WEB开发网 static winSplash win = null; //引用启动屏幕对象
static void ShowSplashScreenThenMainWindow()
{
win = new winSplash();
win.ShowDialog();
//显示主窗体
Application myApp = new Application();
myApp.Run(new winMain());
}
注意上述代码中通过调用ShowDialog()方法显示启动屏幕并阻塞当前UI线程的进一步执行。
主线程在启动UI线程之后,调用SystemInit()方法开始系统初始化过程,在此可以放置各种初始化代码,然后使用win.Dispatcher.Invoke和BeginInvoke方法在启动屏幕上显示信息。
这里面的关键之处在于,SystemInit()方法在执行时必须确保启动屏幕窗体已经显示并可以接收外界传入的信息,为此,示例程序设置了一个ManualResetEvent对象作为线程同步对象,并将其初始化为non-singaled状态:
public static ManualResetEvent mre = new ManualResetEvent(false);
在SystemInit()方法的开头,调用
mre.WaitOne();
阻塞等待通知。
而在启动屏幕的Loaded事件(它表示窗体已初始化完成)中触发ManualResetEvent对象的状态转换:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//通知主线程自己已经启动完毕
Program.mre.Set();
}
当系统初始化完成,SystemInit()方法再通过win.Dispatcher.BeginInvoke方法向UI线程提交一个“关闭启动屏幕”的工作项请求,从而导致UI线程关闭启动屏幕,进而创建应用程序主窗体并显示,应用程序就可以被用户所访问了。
上面就是本示例的所有技术关键点,其余的技术细节请自行阅读源码。
这个示例采用WPF开发,但其中所介绍的技巧完全可用于Windows Form。笔者开发了对应的Windows Form,其示例项目名为SplashScreenForWinForm,供读者参考。
(注:给的示例项目源码为VS2010格式,使用VS2008的读者请新建一个空白的Windows Form或WPF项目,然后手工向其中追加文件)。
本文示例源代码或素材下载
更多精彩
赞助商链接