我想在WinForms应用程序的运行时对各种事情做一些初始化。我正在专门研究每个WinForm应用程序所具有的Program.cs
文件。在其中,我看到:
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
我知道启动应用程序并创建初始表单(在我的例子中是frmMain
的实例)。
我可以不在 Application.Run()
之前放置我的初始化代码吗?我需要做的初始化是检查一些注册表项,必要时创建它们,并连接到数据库。如果我在Application.Run()
之前放置任何功能,我的实例化代码是否可用?
答案 0 :(得分:4)
Application.Run()
启动主线程的消息循环。在那行代码之前你可以做任何事情,除了依赖于windows消息(点击,键盘,......)
答案 1 :(得分:3)
Windows窗体应用程序在调用Main
方法时启动。您可以在Main
函数上实现初始化过程。但是,要完全初始化 Windows窗体应用程序并开始路由 Windows窗体事件,您需要调用Application.Run
。
答案 2 :(得分:3)
是的,没问题,Main()中的代码是样板文件,但不是一成不变的。
请记住,在调用Application.Run()之前运行的任何代码都会延迟用户界面的启动。一旦超过一两秒,给予或接受,您可能需要考虑显示启动画面,以便用户获得程序启动时的一些视觉反馈。在.NET框架的支持下,请检查this answer。
答案 3 :(得分:2)
在Run
之前,您无法使用的一件重要事情是有效SynchronizationContext.Current
。因此,如果您使用任何类型的基于事件的异步模式组件,它们似乎可以正常工作,但会在线程池线程而不是GUI线程上触发它们的事件。
因此,任何将完成事件排入GUI的异步启动代码都应该从事件开始,而不是在Run
之前。
答案 4 :(得分:1)
只要您不需要访问frmMain
中声明的任何内容,就就可以了。
然而the MSDN声明:
开始在当前线程上运行标准的应用程序消息循环。
因此您将无法访问消息循环。
还有另一个重载Application.Run(ApplicationContext)
可以让您在显示表单之前执行代码 - 这似乎是要走的路。
此页面上的示例代码在显示两个表单之前进行了一些初始化,因此您的模型应该没问题。