我做了一些更多的测试,现在我想我知道它们之间的区别了:
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");
}
}