2009-09-27 9 views
11

Je viens de créer une nouvelle application WPF qui compte environ 5 fenêtres et utilise la grille de données Xceed. Après avoir regardé dans le gestionnaire de tâches, j'ai vu que cette petite application avait 19 threads en cours d'exécution.19 Threads pour l'application WPF

Est-ce que cela peut être correct? Je m'attendais à ce que le framework WPF utilise 2-3 threads, mais pas 19. Ou est-ce que je fais quelque chose de mal?

+0

Voilà à peu près comment ça se passe avec n'importe quelle application Windows. 10 est presque le strict minimum si vous montrez un formulaire. –

+0

De quoi a besoin un formulaire avec 10 threads?Il en faut un pour la pompe à message. Quels sont les autres 9? –

+0

Cela semble très étrange. Je m'attendrais à deux threads pour une application régulière avec des threads supplémentaires pour les travailleurs de fond, etc, mais pas 19. –

Répondre

17

Tout d'abord, il ne 19.

Lors de l'exécution d'un "Bonjour, monde!" Application WPF, je vois 10 discussions dans le Gestionnaire des tâches. Lors de l'exécution de la même application à l'aide du débogueur Visual Studio, il utilise 19. Donc, d'abord, factoriser 9 de ceux-ci ajouté comme surcharge du débogueur.

Maintenant pour le 10.

Selon un article MSDN Magazine appelé "Build More Responsive Apps With The Dispatcher", WPF commence avec deux fils:

Toutes les applications WPF commencent avec deux fils importants, un pour le rendu et un pour la gestion de l'interface utilisateur. Le thread de rendu est un thread caché qui s'exécute dans l'arrière-plan , donc le thread unique que vous habituellement traiter est le thread UI .

Mais selon this article, il y a beaucoup de fils de base dans toutes les applications gérées, WPF ou non:

Il existe différents types de .NET threads: finaliseur, GC, débogueur, timer , threadpool, primaire et threads d'arrière-plan. Mais tous les threads liés à .NET sont gérés.

A partir de la deux de WPF, ajouter dans le GC et le finaliseur pour obtenir jusqu'à quatre . Ajouter dans le fil du débogueur (toutes les applications gérées en ont une même quand il ne débogue pas) pour obtenir cinq. Ajouter la minuterie pour obtenir six. Et, en attachant un débogueur à mon application WPF après l'avoir démarré en dehors de VS, je peux voir qu'il y a deux threads de travail dans le pool de threads. C'est probablement un minimum. Cela obtient mon application jusqu'à huit.

Il y en a deux que je ne peux pas expliquer exactement, mais il s'agit probablement de threads COM pour interop (ce ne sont certainement pas des threads gérés). Le second article que j'ai référencé en traite davantage.

Mais la vraie morale de l'histoire ici est, ne vous inquiétez pas à leur sujet. Si une vanille "Bonjour, monde!" L'application utilise 10, c'est votre ligne de base. Ne vous préoccupez que des threads que vous créez au-delà de ce minimum.