[c#] C # ajouter et supprimer des événements d'une minuterie


2 Answers

Le code initial fonctionne MyDelegate , tant que MyDelegate ' ev ' est passé à addEvent et removeEvent est la même instance d'objet (Par exemple, s'il existe un champ MyDelegate niveau MyDelegate qui contient l'instance ou si vous suivez les conseils de plusieurs autres ici et gardez les objets MyDelegate dans un dictionnaire).

Je suppose que le problème est que le code appelant addEvent et removeEvent transmet de nouvelles instances MyDelegate pointant vers une méthode de gestionnaire, comme ceci:

addEvent(new MyDelegate(this.HandlerMethod));
// ... do some stuff
removeEvent(new MyDelegate(this.HandlerMethod));

Dans ce cas, addEvent et removeEvent créent des délégués removeEvent qui pointent vers des adresses de méthodes différentes même si ces délégués pointent vers la même méthode ( this.HandlerMethod ). Cela est dû au fait que les délégués EventHandler qui add et remove créent pointent vers la méthode MyDelegate.Invoke() sur différentes instances MyDelegate plutôt que directement à l'adresse de ce this.HandlerMethod .

Question

J'essaie d'ajouter et de supprimer des événements d'une minuterie et j'ai le code suivant:

Timer myTimer = new Timer(); // Windows.Forms Timer

public void addEvent(MyDelegate ev)
{
    myTimer.Tick += new EventHandler(ev);
}

public void removeEvent(MyDelegate ev)
{
    myTimer.Tick -= new EventHandler(ev);
}

Je ne sais pas Si je fais quelque chose de stupide en essayant d'ajouter et de supprimer des délégués de cette façon, je peux ajouter des délégués et les faire tirer comme prévu. Cependant, lorsque je tente de supprimer les événements, ils continuent à tirer sur Timers Tick.

Quelqu'un peut-il voir quelque chose de manifestement faux?




Vous devriez juste pouvoir vous désabonner en référençant le nom de votre méthode de traitement uniforme comme ceci:

public void removeEvent(MyDelegate ev)
{
    myTimer.Tick -= ev as EventHandler;
}



Je ne sais pas ce que vous faites mal, mais l'approche habituelle que j'utiliserais pour Timers serait de m'abonner à l'événement Tick , puis de désactiver le Timer lorsque vous ne voulez pas recevoir les événements, en le réactivant quand tu fais.

Peut ne pas vous aider si vous avez plus d'un gestionnaire d'événements connecté à l'événement, mais j'espère qu'il sera utile.




Related