WPF应用程序实际上是否需要Application.Run?
到目前为止,我曾假设在WPF应用程序中调用System.Windows.Application.Run
将启动主消息循环,从而为UI提供其“生命”。 至少,这就是WinForms和Gtk#中发生的事情,同样的事情似乎也是针对WPF在这个问题,博客帖子以及文档本身(间接地,通过Dispatcher.Run
)建议的。
WPF的Application.Run
文档强调了调用Run
重要性:
运行被调用来启动一个WPF应用程序。 (...)如果您使用代码定义您的应用程序,则需要显式调用Run。
然后,它演示了一个例子,试图在演示Run
的调用的必要性的演示中引人注目。 事实上 - 评论这条线
app.Run();
从那个例子中得到一个应用程序,它只是暂时显示一个控制台窗口,然后立即退出。
但是,方便的是,该示例中的窗口被创建并显示在Application
对象的OnStartup
方法中,该对象在调用Run
之后被调用。 将窗口相关代码移到Main
方法后,窗口至少会显示一会儿:
[STAThread]
public static void Main()
{
CustomApplication app = new CustomApplication();
//app.Run();
Window window = new Window();
window.Show();
}
显然,这是因为window
是非模态的,在窗口显示并且应用程序马上结束之后,执行就会继续。 所以,如果我们以模态方式显示window
,事情看起来会更好:
[STAThread]
public static void Main()
{
//CustomApplication app = new CustomApplication();
//app.Run();
Window window = new Window();
window.ShowDialog();
}
现在,窗口像往常一样显示。 请注意,我同时不仅注释了Run
调用,而且还注释了Application
对象的实例化。 使用一些逐步执行的检查来确认Application.Current
始终为null
,所以在此应用程序的整个生命周期中都没有Application
实例,并且Application.Run
实际上从未被调用 - 但是,应用程序似乎是响应式的。
ShowDialog
是否执行自己的Dispatcher.Run
调用? 如果是这样,为什么在文档中坚持要调用Application.Run
? 还有什么要打破我没有在这个最小测试遇到的,如果我没有一个Application
对象或调用Application.Run
在我的代码?
一些上下文:我处于默认情况下,没有Application
实例(启动一个新的AppDomain
并从那里为我的基于WPF的GUI提供服务 - 默认情况下Application.Current
在辅助AppDomain
为null
,并且绕过默认入口点在我的主要AppDomain
因为我不希望主AppDomain
承载主窗口,因此我必须决定是否自己调用Application.Run
)。 因此,我试图找出调用Application.Run
是否会导致任何问题,或者调用它是否会以任何方式造成痛苦。
是的, ShowDialog
确实启动了自己的调度程序循环 - 否则窗口将无法处理窗口消息,并且会立即关闭或“挂起”。 它通过创建一个新的DispatcherFrame
并调用Dispatcher.PushFrame
来完成。
除了创建一个窗口并同步运行一个调度器循环外, Application.Run
不会做任何超级重要的事情,所以在这里你不应该有任何问题。