Я обнаружил этот пост в StackOverflow о событиях и гонках, которые мне очень помогли -
C # События и безопасность потоков
Ключевым утверждением здесь является то, что «обработчики событий должны быть устойчивыми при вызове даже после того, как событие было отписано»
Я полагаю, это означает, что когда вы подписываетесь на событие, вы должны быть готовы к тому, что это событие будет инициировано даже после того, как вы отменили подписку, и выполнить какую-то проверку, чтобы увидеть, следует ли обрабатывать событие.
Это может быть что-то столь же простое (и безобразное), как
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);
Теперь очевидно, что вышеприведенный код ужасен, но он служит нужной цели.
У меня вопрос: что может быть более элегантным способом сделать это? Каков типичный способ справиться с этой ситуацией?
Я думал, что вы могли бы сделать
if (!_parent.LoggedIn.Contains(myhandler)) return;
но я пытался, и я думаю, что события разработаны таким образом, чтобы вы не могли видеть других подписчиков.
Что вы думаете?
Спасибо