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在辅助AppDomainnull ,并且绕过默认入口点在我的主要AppDomain因为我不希望主AppDomain承载主窗口,因此我必须决定是否自己调用Application.Run )。 因此,我试图找出调用Application.Run是否会导致任何问题,或者调用它是否会以任何方式造成痛苦。


是的, ShowDialog确实启动了自己的调度程序循环 - 否则窗口将无法处理窗口消息,并且会立即关闭或“挂起”。 它通过创建一个新的DispatcherFrame并调用Dispatcher.PushFrame来完成。

除了创建一个窗口并同步运行一个调度器循环外, Application.Run不会做任何超级重要的事情,所以在这里你不应该有任何问题。

链接地址: http://www.djcxy.com/p/78045.html

上一篇: Does a WPF Application Actually Need Application.Run?

下一篇: Export structure only for testing in Golang