Application.Current.Shutdown()和Application.Current.Dispatcher.BeginInvokeShutdown()先介绍一下:我有一个WPF应用,它是传统Win32应用程序的GUI前端。遗留应用程序在单独的线程中作为DLL运行。用户在UI中选择的命令将在此“旧线程”上调用。如果“遗留线程”结束,GUI前端就不能再做任何有用的事情,所以我需要关闭WPF应用程序。所以在线程方法的末尾,我调用了Application.Current.Shutdown()。由于我不在主线程上,所以我需要调用这个命令。但是,我注意到Dispatcher也有BeginInvokeShutdown()来关闭调度程序。所以我的问题是:调用Application.Current.Shutdown();之间有什么区别?并调用Application.Current.Dispatcher.BeginInvokeShutdown();我做了一些测试,现在我想我知道了区别:1)如MSDN页面中所述,BeginInvokeShutdown除了关闭Dispatcher之外还清除/中止其队列。Shutdown首先处理Dispatcher队列中的所有项目。关闭过程开始后,队列中的所有未决工作项目都将中止。2)在应用程序中,我可以处理Application.Exit事件。当我调用Shutdown时会触发此事件,但不会在调用BeginInvokeShutdown时触发!这同样适用于Window.Closing和Window.Closed。至于相似之处,两种情况下都退出了主线程。根据其他正在运行的线程,这也会关闭进程:非进程线程在进程退出之前运行完成。下面是我的测试代码。在Application_Startup中注解一个或另一个方法调用:publicpartialclassApp{privatevoidApplication_Exit(objectsender,ExitEventArgse){MessageBox.Show("Exiting");}privatevoidApplication_Startup(objectsender,StartupEventArgse){vartestThread=newThread(()=>{Thread.Sleep(2000);Application.Current.Dispatcher.BeginInvokeShutdown(System.Windows.Threading.DispatcherPriority.Send);//Application.Current.Dispatcher.BeginInvoke(新动作(()=>Application.Current.Shutdown()));});测试线程。开始();}}publicpartialclassWindow1{publicWindow1(){this.InitializeComponent();Dispatcher.BeginInvoke(newAction(()=>{Thread.Sleep(1000);Console.WriteLine("One");}));Dispatcher.BeginInvoke(newAction(()=>{Thread.Sleep(1000);Console.WriteLine("Two");}));Dispatcher.BeginInvoke(newAction(()=>{Thread.Sleep(1000);Console.WriteLine("三");}));Dispatcher.BeginInvoke(newAction(()=>{Thread.Sleep(1000);Console.WriteLine("Four");}));}privatevoidWindow_Closed(objectsender,EventArgse){Console.WriteLine("Closed");}privatevoidWindow_Closing(objectsender,System.ComponentModel.CancelEventArgse){Console.WriteLine("Closing");}Shutdown()的MSDN页面BeginInvokeShutdown()的MSDN页面这似乎只是一个术语BeginInvokeShutdown关闭该调度程序并且您的应用程序理论上可以继续运行(尽管没有调度程序它将非常有限)。但是,Shutdown实际上会退出您的应用程序,这正是您想要的。顺便说一下,Daniel——我们的应用程序是以相同的方式构建的——WPF前端到一个单独运行的Win32COM(Delphi)应用程序。讨论和比较我们的方法会很有趣。但是,我偶然发现您的问题的原因是我们的应用程序过去常常调用Dispatcher.BeginInvokeShutdown,它工作正常,但在少数情况下它没有正确终止。当我终于得到一台可重现的机器时,切换到Application.Current.Shutdown()解决了这个问题。我仍然不明白问题出在哪里。以上就是C#学习教程分享的全部内容:Application.Current.Shutdown()和Application.Current.Dispatcher.BeginInvokeShutdown()。如果对您有用,需要进一步了解C#学习教程,希望您多多关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
