2016-02-08 4 views
7

J'ai un bouton de dialogue de lancement qui crée un modèle de vue d'une fenêtre et le lie à la fenêtre (la virutalisation de l'interface utilisateur est activée). Cela ne prend que 1 seconde pour lancer le dialogue au premier clic. Mais si j'ouvre la même boîte de dialogue très fréquemment ou l'une après l'autre, cela prend plus de temps pour remplir la source de données de la grille pour l'itération suivante. si je donne une pause, puis à nouveau ouvrir la fenêtre, alors cela ne prend qu'environ 1 ou 2 secondes.Problème de performances lors de l'ouverture répétée d'une boîte de dialogue dans wpf

for first time populating the item source it take only 1 second: 
next time populating the item source it takes 2 second 
next time populating the item source it takes 3 second 
next time populating the item source it takes 6 second 
next time populating the item source it takes 8 second 

Cependant, si je l'appelle GC.Collect() qui n'est pas recommandé, puis peuplant source de données de la grille prend toujours environ 1 seconde. mais l'appel de

Gc.Collect() 
Gc.WaitForPendingFinalizer() 
Gc.Collect() 

m'a coûté du temps pour chaque itération.

Je sais que l'appel GC.Collect n'est pas une bonne option. Quelqu'un peut-il suggérer comment puis-je améliorer les performances de mon application.

Je suis plus préoccupé par la machine de l'utilisateur que ma machine est avec une très bonne configuration alors que la machine de l'utilisateur peut ne pas si rapide.

+1

Pourquoi est-ce que cela prend plus de temps pour ouvrir la boîte de dialogue à chaque fois? Peut-être que vous chargez trop de données. Pensez à [utiliser pagination] (http://stackoverflow.com/questions/784726/how-can-i-paginate-a-wpf-datagrid) (dans la grille et dans votre requête sql). –

+0

Peut-être que vous avez besoin de '.Dispose' de certaines ressources avant de fermer la boîte de dialogue? –

+0

Tim, je ne comprends pas non plus. probablement que je manque quelque chose mais je ne sais pas quoi.Alors chercher des erreurs possibles –

Répondre

3

Il est difficile d'identifier le problème exact sans regarder le code. Cependant, cela peut généralement arriver en raison de quelques raisons.

  1. Il charge plus de données (peut-être double?) À tout moment. Vous avez indiqué qu'il ne charge que 200 enregistrements à chaque fois. Mais assurez-vous que votre logique est correcte et efface les données précédentes avant de les republier.

  2. Assurez-vous de vous désabonner des abonnements à des événements. Parfois, il peut y avoir des événements Hiden déclencheurs pour les instances de grille précédentes. Vous pouvez facilement vérifier cela en mettant une pause sur une poignée paire et en vérifiant si elle se déclenche plus d'une fois.

  3. Examinez toutes les instances jetables que vous créez et vérifiez si vous les disposez de manière appropriée. Probablement vous ne disposez pas d'instance jetable et cela peut être la raison pour laquelle GC.Collect aide. Je ne suis pas tout à fait sûr de l'implication de la virtualisation ici. Effectuez le même test sans virtualisation pour vous assurer que ce n'est pas la raison.

+0

merci CharithJ, j'ai compris que c'était à cause d'événements que je ne me désinscrivais pas mais je me demande quand même que cet évènement n'était pas levé automatiquement car je relançais manuellement cet évènement en effectuant certaines actions uniquement. Cela n'aurait donc pas dû avoir un impact sur les performances. Maintenant, je suis plus intéressé de savoir si le stockage de tant de gestionnaires d'événements a un impact sur les performances. Je ne comprends pas cette chose. en termes de mémoire, ils n'occupaient pas autant de mémoire. même si elles occupent plus, comment cela affecte-t-il la performance. Pourriez-vous me donner un indice? –

+0

Pas besoin d'occuper beaucoup de mémoire pour soulever des problèmes de mémoire. Peut-être avez-vous affaire à de gros objets? Avoir une lecture sur https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ N'oubliez pas de jeter tous les objets jetables juste avant qu'ils ne sortent de la portée . Implémentez l'interface IDisposable et désinscrivez-vous des événements de la méthode Dispose. – CharithJ

+0

merci beaucoup de partager cet article, c'est exactement ce que je cherchais –