在标准的WinForms应用程序中调用Application.Run()之前,我没有什么用?

时间:2011-04-23 20:21:08

标签: c# .net winforms

我想在WinForms应用程序的运行时对各种事情做一些初始化。我正在专门研究每个WinForm应用程序所具有的Program.cs文件。在其中,我看到:

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new frmMain());
}

我知道启动应用程序并创建初始表单(在我的例子中是frmMain的实例)。

我可以不在 Application.Run()之前放置我的初始化代码吗?我需要做的初始化是检查一些注册表项,必要时创建它们,并连接到数据库。如果我在Application.Run()之前放置任何功能,我的实例化代码是否可用?

5 个答案:

答案 0 :(得分:4)

Application.Run()启动主线程的消息循环。在那行代码之前你可以做任何事情,除了依赖于windows消息(点击,键盘,......)

答案 1 :(得分:3)

Windows窗体应用程序在调用Main方法时启动。您可以在Main函数上实现初始化过程。但是,要完全初始化 Windows窗体应用程序并开始路由 Windows窗体事件,您需要调用Application.Run


了解Application

答案 2 :(得分:3)

是的,没问题,Main()中的代码是样板文件,但不是一成不变的。

请记住,在调用Application.Run()之前运行的任何代码都会延迟用户界面的启动。一旦超过一两秒,给予或接受,您可能需要考虑显示启动画面,以便用户获得程序启动时的一些视觉反馈。在.NET框架的支持下,请检查this answer

答案 3 :(得分:2)

Run之前,您无法使用的一件重要事情是有效SynchronizationContext.Current。因此,如果您使用任何类型的基于事件的异步模式组件,它们似乎可以正常工作,但会在线程池线程而不是GUI线程上触发它们的事件。

因此,任何将完成事件排入GUI的异步启动代码都应该从事件开始,而不是在Run之前。

答案 4 :(得分:1)

只要您不需要访问frmMain中声明的任何内容,就可以了。

然而the MSDN声明:

  

开始在当前线程上运行标准的应用程序消息循环。

因此您将无法访问消息循环。

还有另一个重载Application.Run(ApplicationContext)可以让您在显示表单之前执行代码 - 这似乎是要走的路。

此页面上的示例代码在显示两个表单之前进行了一些初始化,因此您的模型应该没问题。