J'ai trouvé que certains de mes contrôles d'application winform, tels que DataGridView et ToolStrips, sont référencés par UserPreferenceChangedEventHandlers. Je n'ai aucune idée du paramétrage des contrôles qui va générer de telles références et pourquoi de telles références gardent mon contrôle vivant en mémoire. Comment puis-je supprimer de telles références de cet événement? Merci.Qu'est-ce que UserPreferenceChangedEventHandler dans les applications winform C#?
Répondre
Il s'agit du type de délégué pour l'événement SystemEvents.UserPreferenceChanged. Cet événement se déclenche lorsque Windows diffuse le message WM_SETTINGCHANGE. Ce qui se produit généralement lorsque l'utilisateur utilise une applet du panneau de configuration et modifie un paramètre système.
Plusieurs contrôles enregistrent un gestionnaire d'événements pour cet événement, DataGridView, DateTimePicker, MonthCalendar, ProgressBar, PropertyGrid, RichTextBox, ToolStrip, NumericUpDown. Ils sont généralement intéressés par les changements de police ou de cue et tout ce qui pourrait affecter la mise en page.
SystemEvents.UserPreferenceChanged est un événement statique. L'enregistrement d'un gestionnaire et l'oubli de l'annulation entraînent une fuite de mémoire, ce qui empêche le contrôle d'être récupéré. Les contrôles répertoriés assurent que cela ne se produit pas, ils désenregistrent le gestionnaire d'événements dans la méthode OnHandleDestroyed() ou Dispose().
Vous rencontrerez des problèmes si aucune de ces deux méthodes ne fonctionne. Cela se produira lorsque vous supprimerez le contrôle de la collection Controls du conteneur et que vous oublierez de le supprimer. Bien qu'oublier d'appeler Dispose() ne pose normalement pas de problème, c'est une exigence pour les contrôles. Il est facile d'oublier aussi, les contrôles sont normalement automatiquement éliminés par le formulaire. Mais cela ne se produit que pour les contrôles de la collection Controls.
Veillez également à appeler Dispose() sur les formulaires que vous affichez avec la méthode ShowDialog() après avoir obtenu les résultats de la boîte de dialogue. L'instruction using est la meilleure façon de gérer cela.
Un détail atroce est important de l'événement UserPreferenceChanged, il est souvent celui qui DEADLOCKS votre application lorsque vous créez des contrôles sur un thread de travail. Généralement lorsque le poste de travail est verrouillé (appuyez sur Win + L). La classe SystemEvents essaye de déclencher l'événement sur le thread de l'interface utilisateur mais ne peut bien sûr pas le faire correctement lorsque plus d'un thread les a créés.
De même, le type de bogue qui peut avoir un effet durable, un écran de démarrage peut, par exemple, amener la classe SystemEvents à deviner quel thread est votre thread d'interface utilisateur. Après quoi, il soulève alors définitivement l'événement sur le mauvais fil. Très moche to diagnose, l'impasse est bien caché.
- 1. Winforms Hôte C# dans les applications VB6
- 2. Bibliothèques gratuites pour ajouter des icônes à des applications WinForm?
- 3. Hébergement contrôle personnalisé dans DataGridView - C# WinForm
- 4. Connectivité des applications Winform/Application ASP.NET avec les bases de données SAP
- 5. C# Winform Formulaires sous forme
- 6. MVP/MVC vs approche n-tier traditionnelle pour les applications winform
- 7. C# Winform Alter Sent Keystroke
- 8. bibliothèques c couramment utilisées pour les applications?
- 9. C# pour les applications de télécommunication?
- 10. .net - Effet de verre dans les applications C# 2.0
- 11. C# Exécution d'un programme winform en tant que personne autre que l'utilisateur connecté
- 12. C# Cadre de multithreading pour l'application WinForm
- 13. .NET Événements plus communs dans winform que webform?
- 14. Contrôle WYSIWYG pour Winform
- 15. Applications MySQL et C
- 16. Superpositions dans les applications Windows
- 17. BDC - Problèmes dans les applications
- 18. DataGridView Filtrage OnClick Event (C# WinForm)
- 19. C# un formulaire bloquant une autre dans un WinForm projet
- 20. C# Winform Label inversé sur Vista
- 21. Test automatisé pour les applications GUI C/C++
- 22. Élimination des ressources inutilisées dans l'application C# winform GLOBALLY
- 23. JSF dans les applications d'entreprise
- 24. C# WINForm évite deux boîtes de message
- 25. winform C#: insérer un autre contrôle de formulaire après un événement dans C#
- 26. IE 7 intégré dans l'application WinForm gèle toute application Winform
- 27. winform mdi catch enfant forme focus C#
- 28. Remplacer «\» par «/» dans une chaîne App C# WinForm
- 29. De bonnes applications asp.net (C#)?
- 30. Dans .NET (C#), comment faire référence à une variable dans un WinForm à partir d'un WinForm enfant?
Nous vous remercions de votre suggestion. J'ai vérifié le code et il semble que le contrôle problématique a été ajouté à la liste de contrôle d'un panneau et le panneau a été ajouté à la liste de contrôle d'un autre panneau et enfin le panneau racine a été ajouté à la liste de contrôle du formulaire. À partir du profileur de mémoire, je peux également voir que la méthode disposer du contrôle a été appelée mais que UserPreferenceChangedEventHandler se bloque toujours. C'est la partie que je ne comprends pas. Y a-t-il d'autres choses que j'ai ratées? – Steve
Mais merci pour la réponse. Je vais le prendre. – Steve
Bonne réponse MAIS comme le mentionne Steve, parfois même si vous disposez du contrôle, vous avez toujours ce problème. Il existe plusieurs entrées Connect à propos de ce problème, telles que: http://connect.microsoft.com/VisualStudio/feedback/details/469277/toolstrip-statusstrip-toolstriptextbox-visibility-and-userpreferencechangedeventhandler. –