2010-08-24 25 views
0

J'ai été trying to debug pourquoi la fermeture de Windows Forms Designer bloque Visual Studio et a découvert en ajoutant une série de boîtes de message que si mes contrôles sont imbriqués dans un System::Windows::Forms::TabControl le destructeur de ces contrôles sont appelés deux fois.Pourquoi un contrôle est-il détruit deux fois lorsqu'il est imbriqué dans un contrôle de tabulation?

Est-ce que ce comportement est attendu et existe-t-il un moyen de l'éviter?

Répondre

1

La méthode Dispose() peut être appelée plusieurs fois, aucune règle ne dit qu'elle n'est pas légale. Si vous le remplacez (implémentez le destructeur en C++/CLI), vous devez vous assurer que votre code est résilient à cela. Très souvent fait avec un champ isDisposed dans la classe.

+0

Est-il préférable/plus standard d'implémenter/surcharger la méthode disposer ou de le faire dans un constructeur? ..ou est-ce encore une autre ambiguïté CLI C++? –

+0

Mapping Dispose() pour le destructeur était un choix malheureux dans mon livre. Essayer trop de faire ressembler C++, mais ne pas avoir le même comportement. Le langage ne vous permettra pas de l'implémenter explicitement. Mais prenez du recul, l'implémentation de Dispose() n'est pas souvent nécessaire dans un UserControl. Il dispose déjà des contrôles constitutifs automatiquement. –

+0

La difficulté que j'ai est que mes contrôles d'utilisateur ont des travailleurs d'arrière-plan en cours d'exécution pour acquérir des données. Ceux-ci doivent être arrêtés proprement lorsque l'application se ferme. Est-ce le genre d'endroit où vous pourriez utiliser la méthode d'élimination? –