D'abord un peu d'arrière-plan: J'ai une application WPF, qui est une interface graphique d'une application Win32 héritée. L'application héritée s'exécute en tant que DLL dans un thread distinct. Les commandes que l'utilisateur choisit dans l'interface utilisateur sont appelées sur ce "thread hérité". Si le "thread hérité" se termine, l'interface graphique ne peut plus rien faire d'utile, j'ai donc besoin de fermer l'application WPF. Par conséquent, à la fin de la méthode du fil, j'appelle Application.Current.Shutdown()
.Application.Current.Shutdown() par rapport à Application.Current.Dispatcher.BeginInvokeShutdown()
Puisque je ne suis pas sur le thread principal, j'ai besoin d'invoquer cette commande. Cependant, j'ai remarqué que le Dispatcher a également BeginInvokeShutdown()
pour arrêter le répartiteur. Donc, ma question est: Quelle est la différence entre l'invocation
Application.Current.Shutdown();
et appeler
Application.Current.Dispatcher.BeginInvokeShutdown();
Eh bien, c'est précisément la question à laquelle il n'y a pas de réponse dans la documentation: Est-ce que l'arrêt de l'expéditeur de l'application interrompt également l'application? –
J'ai construit une application de test WPF simple pour cela. Pour simuler votre code, j'ai fait: 'Thread t = new Thread (nouveau ThreadStart (delegate() {Thread.Sleep (50000);})); t.Start(); Application.Current.Dispatcher .BeginInvokeShutdown (System.Windows.Threading.DispatcherPriority.Normal); '. L'arrêt de Dispatcher a tué son thread propriétaire et a fermé la fenêtre, mais n'a pas * tué * le thread d'arrière-plan. – JustABill
Deux petites différences: 1) J'appelle l'arrêt dans le deuxième thread (bien que grâce à des tests, je peux voir que cela ne fait aucune différence). 2) J'ai le second thread défini comme thread d'arrière-plan (IsBackground = true). De cette façon, il est également tué si le thread principal se ferme. –