Application.Actuel.Shutdown() par rapport à l'Application.Actuel.Répartiteur.BeginInvokeShutdown()
D'abord un peu de contexte: j'ai une application WPF, qui est l'interface front-end pour un héritage Win32 application. L'héritage application s'exécute en tant que DLL dans un thread séparé. Les commandes de l'utilisateur choisit dans l'INTERFACE utilisateur sont invoquées lors que "l'héritage du fil".
Si la "héritage thread" finitions, la GUI-frontal ne peut rien faire de plus utile, j'ai donc besoin d'arrêter le WPF application. Par conséquent, à la fin du thread de la méthode, je l'appelle Application.Current.Shutdown()
.
Depuis que je ne suis pas sur le thread principal, j'ai besoin d'invoquer cette commande. Cependant, j'ai remarqué que le Répartiteur a également BeginInvokeShutdown()
à l'arrêt du répartiteur. Donc ma question est: Quelle est la différence entre l'invocation
Application.Current.Shutdown();
et de l'appel de
Application.Current.Dispatcher.BeginInvokeShutdown();
OriginalL'auteur Daniel Rose | 2010-05-28
Vous devez vous connecter pour publier un commentaire.
J'ai fait des tests un peu plus, et maintenant je pense que je connais la différence:
1), Comme indiqué dans la page MSDN,
BeginInvokeShutdown
, en plus de la fermeture de l'expéditeur, efface aussi/abandonne sa file d'attente.Shutdown
première traite de tous les éléments dans la file d'attente Dispatcher.2) Dans une application je peux traiter le Application.Sortie événement. Cet événement est déclenché quand j'appelle à l'Arrêt, mais PAS viré quand je l'appelle BeginInvokeShutdown! La même chose s'applique à De la fenêtre.Fermeture et De la fenêtre.Fermé.
Que les similitudes, dans les deux cas, le thread principal est fermé. Selon d'autres threads en cours d'exécution, cette arrête également le processus: non-threads d'arrière-plan sont exécuter jusqu'à la fin avant que le processus s'arrête.
Ci-dessous mon code de test. Commenter l'un ou l'autre appel de méthode dans Application_Startup:
OriginalL'auteur Daniel Rose
Page MSDN pour Shutdown()
Page MSDN pour BeginInvokeShutdown()
Il semble que c'est juste une collision de la terminologie.
BeginInvokeShutdown
s'arrête que répartiteur, votre application peut, en théorie, de continuer à vivre par la suite (bien que, sans un répartiteur, il serait assez limité).Shutdown
cependant fait des sorties de votre demande qui est ce que vous voulez.J'ai construit un simple WPF application de test pour cela. Pour simuler votre code, j'ai fait:
Thread t = new Thread(new ThreadStart(delegate() { Thread.Sleep(50000); })); t.Start(); Application.Current.Dispatcher .BeginInvokeShutdown(System.Windows.Threading.DispatcherPriority.Normal);
. Le Répartiteur d'arrêt tué son propriétaire fil et a fermé la fenêtre, mais n' pas tuer le thread d'arrière-plan.Deux petites différences: 1) j'ai d'appel de l'arrêt de la deuxième thread (bien que, par des tests, je peux voir qu'il ne fait pas de différence). 2) j'ai le deuxième thread définir comme thread d'arrière-plan (IsBackground = true). De cette façon, il sera tué si le thread principal se ferme.
OriginalL'auteur JustABill
Par la voie, Daniel - notre application est construite de la même manière - WPF front-end pour un Win32 COM (Delphi) application en cours d'exécution séparément. Il serait intéressant de parler et de comparer nos approches.
Mais pourquoi je suis tombé par hasard sur votre question, c'est que notre application utilisée pour appeler l'expéditeur.BeginInvokeShutdown, qui a bien fonctionné, à l'exception de quelques cas où il ne s'est pas terminé correctement. Quand j'ai enfin eu mes mains sur une machine sur laquelle il a été reproductible, la commutation de l'Application.Actuel.Shutdown() fixe le problème. Je ne comprends toujours pas quel était le problème.
OriginalL'auteur Sergey Aldoukhov