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