代码之家  ›  专栏  ›  技术社区  ›  Daniel Rose

Application.Current.Shutdown()与Application.Current.Dispatcher.BeginInvokeShutdown()之比较

  •  7
  • Daniel Rose  · 技术社区  · 15 年前

    如果“遗留线程”完成,GUI前端就不能再做任何有用的事情,所以我需要关闭WPF应用程序。因此,在线程方法的末尾,我调用 Application.Current.Shutdown() .

    因为我不在主线程上,所以我需要调用这个命令。然而,我注意到调度器也有 BeginInvokeShutdown() 关闭调度员。所以我的问题是:调用

    Application.Current.Shutdown();
    

    Application.Current.Dispatcher.BeginInvokeShutdown();
    
    3 回复  |  直到 15 年前
        1
  •  9
  •   Daniel Rose    15 年前

    1) 如MSDN页面所述, BeginInvokeShutdown Shutdown 首先处理调度程序队列中的所有项。

    2) 在应用程序中,我可以处理 Application.Exit Window.Closing Window.Closed .

    下面是我的测试代码。在应用程序启动时注释一个或另一个方法调用:

    public partial class App
    {
        private void Application_Exit(object sender, ExitEventArgs e)
        {
            MessageBox.Show("Exiting");
        }
    
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            var testThread = new Thread(
                () =>
                {
                    Thread.Sleep(2000);
                    Application.Current.Dispatcher.BeginInvokeShutdown(System.Windows.Threading.DispatcherPriority.Send);
                    //Application.Current.Dispatcher.BeginInvoke(new Action(() => Application.Current.Shutdown()));
                });
            testThread.Start();
        }
    }
    
    public partial class Window1
    {
        public Window1()
        {
            this.InitializeComponent();
    
            Dispatcher.BeginInvoke(new Action(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("One");
            }));
    
            Dispatcher.BeginInvoke(new Action(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("Two");
            }));
    
            Dispatcher.BeginInvoke(new Action(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("Three");
            }));
    
            Dispatcher.BeginInvoke(new Action(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("Four");
            }));
        }
    
        private void Window_Closed(object sender, EventArgs e)
        {
            Console.WriteLine("Closed");
        }
    
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Console.WriteLine("Closing");
        }
    }
    
        2
  •  1
  •   JustABill    15 年前

    MSDN page for Shutdown()
    MSDN page for BeginInvokeShutdown()

    BeginInvokeShutdown 关掉那个 调度员 Shutdown 但是实际上退出了应用程序,这正是您所需要的。

        3
  •  0
  •   Sergey Aldoukhov    14 年前

    但我偶然发现您的问题的原因是,我们的应用程序曾经调用Dispatcher.BeginInvokeShutdown,除了少数情况下没有正确终止之外,它工作得很好。当我终于在一台机器上得到了这是可复制的,切换到Application.Current.Shutdown()修复了这个问题。我还是不明白是什么问题。