Я провел еще несколько тестов, и теперь я думаю, что знаю различия:
1) Как указано на странице MSDN, BeginInvokeShutdown
, помимо выключения Диспетчера, также очищает / прерывает свою очередь. 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");
}
}