Анонимный делегат может отказаться от подписки самостоятельно от события, после того как оно было запущено?

Я задаюсь вопросом, какова 'лучшая практика' при просьбе, чтобы обработчик событий отказался от подписки сам после увольнения однажды.

Для контекста это - моя ситуация. Пользователь зарегистрирован и находится в состоянии готовности для обработки объектов работы. Они получают объект работы, обрабатывают его, затем вернитесь к готовому снова. На данном этапе они могут хотеть сказать, что они не доступны для большего количества объектов работы, но каждый отправляется им так или иначе. То, что я хочу смочь сделать, позволяют пользователю 'очереди', 'я не доступен', как только та операция становится возможной.

public event SomeHandler StateChanged = delegate {};

public void QueueNotAvailable() 
{
    StateChanged += (s,e) => {
                                 if (e.CanGoNotAvailable) { 
                                     someObject.NotAvailable();
                                     StateChanged -= {thishandler};
                                 }
                             }
}

В моих целях, если отдельный поток, оказывается, исчерпывает события и этот конкретный обработчик, работает дважды, это не проблема. Запрос той же функции очень близко друг к другу приемлем. Я просто не хочу это запускающий каждый раз, когда операция позволяется.

17
задан Josh Smeaton 21 June 2010 в 04:36
поделиться

1 ответ

Вы можете сохранить экземпляр делегата перед подпиской на событие:

public void QueueNotAvailable() 
{
    SomeHandler handler = null;
    handler = (s,e) {
        // ...
        StateChanged -= handler;
    };
    StateChanged += handler;
}

Я считаю, что это должно сработать ... Мне пришлось поместить туда начальный handler = null , иначе вы получите ' Использование ошибок компиляции неназначенных локальных переменных, но я думаю, что это на самом деле неопасно.

40
ответ дан 30 November 2019 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: