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中注释一个或另一个方法调用:
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"); } }
关机()的MSDN页面
BeginInvokeShutdown()的MSDN页面
这似乎只是术语的碰撞。 BeginInvokeShutdown
关闭了该调度程序,您的应用程序理论上可以继续生效(尽管没有调度程序,它会非常有限)。 然而, Shutdown
实际上会退出您的应用程序,这就是您想要的。
顺便说一句,Daniel – 我们的应用程序以相同的方式构建 – WPF前端到单独运行的Win32 COM(Delphi)应用程序。 谈谈和比较我们的方法会很有趣。
但是为什么我偶然发现你的问题是我们的应用程序曾经调用过Dispatcher.BeginInvokeShutdown,它运行良好,除了一些没有正确终止的情况。 当我最终得到一台可重现的机器时,切换到Application.Current.Shutdown()修复了问题。 我还是不明白是什么问题。
上述就是C#学习教程:Application.Current.Shutdown()与Application.Current.Dispatcher.BeginInvokeShutdown()分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1033504.html