2010-07-13 7 views
2

J'ai une application qui s'exécute en continu, elle crée et détruit des classes dont certaines ont des événements comme des événements de clic de souris et autres ... Première question est de savoir comment se désinscrire? Si l'abonnent ressemble à ceci:C# .NET événement approprié abonnement et désabonnement

Panel1.MouseClick += new MouseEventHandler(Action_MouseClick); 

est-il bon pour vous désabonner comme ceci:

Panel1.MouseClick -= new MouseEventHandler(Action_MouseClick); 

OU est-il autorisé à le faire:

Panel1.MouseClick -= Action_MouseClick; 

ou est de toute façon ok?

Mon autre question est la suivante: Si j'utilise le studio Microsoft Visual C# pour créer les événements via le concepteur, est-il automatiquement désabonné dans le cadre de la méthode 'Dispose'? Ou dois-je encore mettre la méthode de désinscription dans le code?

Répondre

2

L'une ou l'autre façon de désabonnement aura le même effet, et les deux sont corrects. Comme pour votre autre question .. si vous utilisez le concepteur pour créer des événements pour les contrôles sur un formulaire, lorsque le formulaire est disposé la source des événements n'existe plus, ils ne seront donc pas appelés. Je suppose que je dis qu'il n'est pas nécessaire de détacher ces événements.

+0

Merci qstarin ... J'ai remarqué que le programme va lentement fuir la mémoire et je me demande si la classe a été correctement éliminée si je ne me désabonne pas de certains des événements qui sont définis par le concepteur, ce qui signifie double-cliquant sur Un bouton dans le concepteur créera l'événement buttonClick. Mais je n'ai pas été abonné à ces événements. Selon l'article: « http://msdn.microsoft.com/en-us/library/ms366768%28VS.80%29.aspx » Im se demandant si le garbage collector supprime l'objet du tas si je n'ai pas été abonné à ces événements. – ecklerpa

+0

Dans cet article, "Tant que l'objet de publication contient cette référence, votre objet abonné ne sera pas collecté." Un contrôle sur le formulaire est l'objet de publication.La seule référence au contrôle est sa variable membre dans le formulaire (généralement le cas, sauf si vous maintenez une référence au contrôle en particulier). Toutes les références sont inaccessibles et doivent être collectées –

+0

Sinon, en guise de vérification de cohérence, je pense que si le concepteur s'est automagiquement abonné, mais n'a pas automagiquement désinscription, et qui a causé une fuite de mémoire, alors beaucoup d'applications .Net auraient ce problème - et, peut-être évidemment, ce n'est pas le cas (ou nous en entendrions parler plus, oui) –

1

Mon autre question est de savoir si j'utilise le studio Visual C# Microsoft pour créer les événements par le concepteur, il ne désabonnement automatiquement dans le cadre de la méthode « Jeter »? Ou dois-je encore besoin de mettre la méthode de désinscription dans le code?

De mémoire: non, il ne générera pas le code de désabonnement.

Vous pouvez vérifier cela vous-même en ouvrant le fichier classname.designer.cs et en examinant la méthode Dispose générée.

+0

Vous avez raison, ce n'est pas le cas. –

+0

Merci les gars! Je l'apprécie ... – ecklerpa

+0

Juste une mise à jour ... Cela aide à utiliser les versions 'Release' du logiciel que vous créez ... J'ai trouvé que le système enlèverait beaucoup mieux la mémoire allouée à l'application qu'avec 'Debug' versions. – ecklerpa

1

Le code du concepteur ne se désinscrit pas automatiquement, mais les abonnements ne doivent pas maintenir les contrôles actifs tant que le formulaire et tous ses contrôles ne sont plus accessibles depuis le code de l'application. Les gestionnaires d'événements persistants sont principalement un problème lorsque l'abonné et le producteur d'événements ont des durées de vie différentes, ce qui ne devrait généralement pas être le cas pour un formulaire et ses contrôles. Si vous créez/supprimez des contrôles de façon dynamique, vous voudrez probablement gérer les événements, bien que cela ne soit pas strictement nécessaire si les contrôles supprimés ne sont plus référencés et que les contrôles supprimés cessent de déclencher des événements.