j'ai découvert ce post sur StackOverflow sur les événements et les courses qui m'a énormément aidé -Plus d'informations sur les événements et la sécurité des threads
La déclaration clé ici est que « Les gestionnaires d'événements doivent être robustes face J'entends par là que lorsque vous vous abonnez à un événement, vous devez vous préparer à ce que cet événement soit déclenché même après vous être désabonné, et faire une sorte de tri. de vérifier pour voir si l'événement devrait être traité.
Cela pourrait être quelque chose aussi simple (et laid) comme
bool _acceptEvents;
// event handler
void LoggedIn(object sender, EventArgs a)
{
if (!_acceptEvents) return;
Evt("Now logged in");
}
// code to unsubscribe to event
_acceptEvents = false;
_parent.LoggedIn -= new LoggedInEventHandler(LoggedIn);
Maintenant, évidemment, le code ci-dessus est un dieu terrible à regarder, mais il sert l'objectif requis. Ma question est, quelle serait une façon plus élégante de le faire? Quelle est la manière typique de gérer cette situation?
Je pensais que vous pourriez peut-être faire
if (!_parent.LoggedIn.Contains(myhandler)) return;
mais j'ai essayé, et je suppose que les événements sont conçus de manière à vous empêcher de voir d'autres abonnés.
Qu'en pensez-vous?
Merci
Vos _acceptEvents vous semblent OK et aussi élégants que possible. –
Ce n'est pas techniquement correct, une barrière de mémoire est requise. Cela marchera cependant, il y en a un implicite dans l'événement non-abonnement. Déclarer la variable * volatile * est suffisant. –
Barrière de mémoire nécessaire pour quoi exactement? – NoPyGod