Utilisation de l’instruction autour du formulaire de dialog pour assurer la récupération de place

Nous avons une application Windows Forms qui contient des milliers de formulaires.

Beaucoup d’entre eux sont temporairement affichés sous forme de boîtes de dialog via la méthode ShowDialog ().

Cette application existe depuis des années et nous avons découvert que bon nombre des formulaires ne sont pas récupérés dans les délais impartis en raison de diverses fuites de ressources dans le formulaire ou des contrôles utilisés.

Plus précisément, nous avons trouvé des exemples de ressources GDI + qui ne sont pas éliminées correctement, bien qu’il puisse y avoir d’autres types de fuites de ressources qui n’ont pas encore été caractérisées.

Bien que la bonne façon de résoudre ce problème soit évidemment de passer par toutes les formes et tous les contrôles et d’éliminer tous les problèmes de ressources. Cela prendra du temps à accomplir.

En guise d’alternative à court terme, nous avons constaté que l’appel explicite de Dispose () sur le formulaire semble initier le processus de récupération de place et que le formulaire et ses ressources sont désalloués immédiatement.

Ma question est de savoir si une solution de contournement raisonnable serait de placer le bloc ShowDialog () de chaque formulaire dans une instruction using afin que Dispose () soit appelé après l’affichage du formulaire. S’agirait-il également d’une bonne pratique à instituer?

Par exemple, modifiez le code existant à partir de ceci:

public void ShowMyForm() { MyForm myForm = new MyForm(); myForm.ShowDialog(); } 

Pour ça:

 public void ShowMyForm() { using (MyForm myForm = new MyForm()) { myForm.ShowDialog(); } } 

Lors de nos tests, la méthode MyForm Dispose () n’est jamais appelée pour le premier exemple, mais elle est immédiatement appelée pour le deuxième exemple.

Cela vous semble-t-il une approche raisonnable comme solution de contournement à court terme pendant que nous passons le temps à rechercher chacune des questions de ressources spécifiques?

Existe-t-il d’autres approches que nous pourrions envisager pour une solution de contournement à court terme et / ou des méthodologies pour identifier et résoudre ces types de problèmes de ressources?

Selon MSDN , vous devez appeler explicitement Dispose sur les formulaires affichés à l’aide de ShowDialog (contrairement à la méthode Show):

Lorsqu’un formulaire est affiché en tant que boîte de dialog modale, un clic sur le bouton Fermer (le bouton avec un X dans le coin supérieur droit du formulaire) provoque le masquage du formulaire et la définition de la propriété DialogResult sur DialogResult.Cancel. Contrairement aux formulaires non modaux, la méthode Close n’est pas appelée par .NET Framework lorsque l’utilisateur clique sur le bouton de formulaire de fermeture d’une boîte de dialog ou définit la valeur de la propriété DialogResult. Au lieu de cela, le formulaire est masqué et peut être affiché à nouveau sans créer une nouvelle instance de la boîte de dialog. Dans la mesure où un formulaire affiché sous forme de boîte de dialog est masqué au lieu de fermé, vous devez appeler la méthode Dispose du formulaire lorsque le formulaire n’est plus utilisé par votre application.

Pour les dialogs modaux, vous devez utiliser le motif:

 using ( var dlg = new MyDialog() ) { // other code here to initialize, etc. dlg.ShowDialog(); } 

Étant donné que MyDialog est dérivé de Form et que Form implémente IDisposable , ce modèle nettoie correctement votre boîte de dialog.

Cela ne devrait pas être une “solution de contournement à court terme”, mais la manière standard d’appeler tous vos dialogs modaux.

Les dialogs sans mode sont une autre histoire. Vous devrez les garder vous-même et appeler Dispose aux points appropriés de votre application.

En général, c’est un bon moyen d’utiliser l’instruction using pour les objects qui implémentent IDisposable.

Un petit exemple de situation:

Disons que vous avez un “composant” tiers. Vous ne pouvez pas savoir ce qui se passe en interne et peut-être que cet object crée un fichier temporaire et le supprime sur Dispose Si vous n’appelez pas Dispose() et n’utilisez pas, le fichier ne sera jamais supprimé.

Dans votre cas, vous pouvez le faire aussi longtemps que vous ouvrez votre formulaire modal .