Может ли анонимный делегат отказаться от подписки на событие после его увольнения?
Мне интересно, что такое "лучшая практика", когда вы просите обработчика событий отказаться от подписки на себя после стрельбы один раз.
В контексте, это моя ситуация. Пользователь вошел в систему и находится в состоянии готовности для обработки рабочих элементов. Они получают рабочий элемент, обрабатывают его, а затем снова возвращаются к готовому. На этом этапе они могут захотеть сказать, что они недоступны для большего количества рабочих элементов, но в любом случае их отправляют. То, что я хочу сделать, позволяет пользователю "ставить в очередь" "Я недоступен", как только эта операция станет возможной.
public event SomeHandler StateChanged = delegate {};
public void QueueNotAvailable()
{
StateChanged += (s,e) => {
if (e.CanGoNotAvailable) {
someObject.NotAvailable();
StateChanged -= {thishandler};
}
}
}
В моих целях, если отдельный поток запускает события, и этот обработчик работает дважды, это не проблема. Прием одной и той же функции очень близко друг к другу является приемлемым. Я просто не хочу, чтобы он срабатывал каждый раз, когда операция разрешена.
Ответы
Ответ 1
Вы можете сохранить экземпляр делегата перед подпиской на событие:
public void QueueNotAvailable()
{
SomeHandler handler = null;
handler = (s,e) {
// ...
StateChanged -= handler;
};
StateChanged += handler;
}
Я считаю, что это должно было бы это сделать... Я должен был разместить исходный handler = null
там, иначе вы получите ошибки компиляции "Использование непризнанной локальной переменной", но я думаю, что это действительно доброкачественное.