Как реализовать отменяемое событие? - PullRequest
9 голосов
/ 17 ноября 2008

В System.ComponentModel есть класс с именем CancelEventArgs, который содержит член Cancel, который можно установить в прослушивателях событий. Документация по MSDN объясняет, как использовать это для отмены событий внутри слушателя, но как мне использовать его для реализации моих собственных отменяемых событий? Можно ли проверить элемент «Отмена» после срабатывания каждого слушателя, или мне нужно подождать, пока событие не запустит всех слушателей?

1 Ответ

16 голосов
/ 17 ноября 2008

Чтобы проверить каждого слушателя по очереди, вам нужно вручную получить обработчики через GetInvocationList:

class Foo
{
    public event CancelEventHandler Bar;

    protected void OnBar()
    {
        bool cancel = false;
        CancelEventHandler handler = Bar;
        if (handler != null)
        {
            CancelEventArgs args = new CancelEventArgs(cancel);
            foreach (CancelEventHandler tmp in handler.GetInvocationList())
            {
                tmp(this, args);
                if (args.Cancel)
                {
                    cancel = true;
                    break;
                }
            }
        }
        if(!cancel) { /* ... */ }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...