WPF应用程序是否真的需要Application.Run?

时间:2014-03-08 23:51:32

标签: wpf

到目前为止,我假设在WPF应用程序中调用System.Windows.Application.Run会启动其主消息循环,从而为UI提供“生命”。至少,这就是WinFormsGtk#中发生的事情,似乎在this questionthat blogpost中为WPF建议了同样的事情,最终{{3}自己(间接地,通过docs)。

Dispatcher.Run强调调用Run的重要性:

  

调用Run以启动WPF应用程序。 (...)如果使用代码定义应用程序,则需要显式调用Run。

然后,它提供了一个示例,试图说明调用Run的必要性。确实 - 评论出这条线

app.Run();

从该示例中生成的应用程序只是暂时显示控制台窗口,然后立即退出。

但是,方便的是,该示例中的窗口被创建并显示在Application对象的documentation for WPF's Application.Run中,该对象在调用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对象的实例化。检查一些逐步执行确认OnStartup method始终为null,因此在此应用程序的整个生命周期内没有Application实例,并且Application.Run实际上从未被调用 - 但是,应用似乎是响应。

ShowDialog是否会执行Dispatcher.Run的调用?如果是这样,为什么坚持在文档中调用Application.Run?如果我的代码中没有Application对象或Application.Run的调用,那还有什么可以打破我在这个最小测试中没遇到的吗?

某些上下文:我处于一种情况,默认情况下,没有Application实例(启动新的Application.Current并从那里提供基于WPF的GUI - {{1默认情况下,辅助Application.Current中的nullAppDomain,我绕过主AppDomain中的默认入口点,因为我不希望主要AppDomain承载主窗口,因此我必须决定是否在那里打电话给Application.Run。因此,我试图找出调用Application.Run是否会导致任何问题,或

1 个答案:

答案 0 :(得分:4)

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

除了创建一个窗口并同步运行一个调度程序循环之外,

Application.Run没有做任何超级重要的事情,所以你在这里做的事情应该没有任何问题。