C# 什么是';在标准WinForms应用程序中调用Application.Run()之前,我不可用吗?

C# 什么是';在标准WinForms应用程序中调用Application.Run()之前,我不可用吗?,c#,.net,winforms,C#,.net,Winforms,我想在WinForms应用程序的运行时对各种事情进行一些初始化。我特别关注的是每个WinForm应用程序都具有的Program.cs文件。我从中看到: [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); } 我知道这就是

我想在WinForms应用程序的运行时对各种事情进行一些初始化。我特别关注的是每个WinForm应用程序都具有的
Program.cs
文件。我从中看到:

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new frmMain());
}
我知道这就是启动应用程序并创建初始表单的原因(在我的例子中,是
frmMain
的一个实例)


我是否可以将初始化代码放在应用程序.Run()之前?我需要做的初始化是检查几个注册表项,必要时创建它们,然后连接到数据库。如果我将实例化代码的任何功能放在
应用程序.Run()

应用程序.Run()
启动主线程的消息循环之前,它是否不可用。因此,在这行代码之前,您可以执行任何操作,除了依赖于windows消息的操作(单击、键入等)

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

然而,缔约国指出:

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

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

还有另一个重载,它可以让您在显示表单之前执行代码——这似乎是一种方法


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

Windows窗体应用程序在调用
Main
方法时启动。您可以在
Main
功能上执行初始化过程。但是,若要完全初始化Windows窗体应用程序并启动它路由Windows窗体事件,您需要调用
应用程序。运行



阅读

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


请记住,在调用Application.run()之前运行的任何代码都会延迟用户界面的启动。一旦超过了第二个或两个,给出或采取,你可能想考虑显示一个飞溅屏幕,以便用户得到一些视觉反馈,你的程序开始。受.NET framework的良好支持,请检查。

在运行
之前,您没有的一件重要事情是有效的
同步上下文。当前的
。因此,如果您使用任何类型的基于事件的异步模式组件,它们看起来都可以正常工作,但会在线程池线程而不是GUI线程上触发事件


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

之前。我在
Application.Run(form)
之前执行过数据库操作。这是个好消息!我有一个小表格,用作进度指示器。当应用程序启动时,此表单将是用户看到的第一件事。通常我要做的是创建一个不可见的表单,它是第一个加载的表单。然后,此表单依次创建通用进度表单并进行加载。但是,
Program.cs
中的初始化要好得多。谢谢有趣。如果我在初始化代码中创建了一个新的frmMain实例,然后将其传递给
Application.Run()
?@SimpleCoder-我想您可以这样做。我自己没试过,只是试了一下,效果不错。这种方法的唯一问题是,如果发生错误,我无法完全退出应用程序
Application.Exit()
不起作用,因为尚未调用
Run
。我认为创建自己的
ApplicationContext
类是一条可行之路。非常感谢。发现我可以使用
Environment.Exit(0)
代替
Application.Run()
.Aha!我可以调用
Application.Run()
,而不使用表单或上下文作为参数。然后,我可以执行初始化。在调用
Run
后执行此操作,可以在必要时与我在初始化期间创建的表单进行交互。最后,我可以手动创建主窗体并显示它。通过这种方式,即使您关闭了主窗体,您的应用程序仍将运行,直到您显式调用application.Exit()。哦,那么也许我应该在
应用程序之前先初始化。Run()
。。。不管怎样,我都得做实验。说得好,谢谢。我将创建一个启动屏幕,或者可能只是使用我的进度对话框,并结合我在阿克兰·沙赫达回答下的评论。