Обработчики перезаписывают свойство Cancel в CancelEventArgs - PullRequest
3 голосов
/ 02 марта 2009

CancelEventArgs предоставляет свойство с именем Cancel, которое могут быть установлены различными обработчиками событий, чтобы сообщить объекту, вызвавшему событие, следует ли продолжать выполнение, отмените действие.

Кажется, что, поскольку события являются многоадресными делегатами, простое поднятие события может вызвать двух делегатов. Первый устанавливает для свойства Cancel значение true, второй устанавливает для свойства Cancel значение false. Поддерживают ли события «отменяемые» компоненты / рамки эти сценарии и вызывают каждый делегат один за другим, проверяя флаг отмены на каждом шаге? Какова лучшая практика для проведения подобных мероприятий? Только один экземпляр CancelEventArgs передается каждому делегату? Используются ли отдельные экземпляры?

Ответы [ 2 ]

2 голосов
/ 02 марта 2009

Небольшой эксперимент быстро показывает, что они используют 1 экземпляр Cancel (возможно, объекта EventArgs).

Это делает игру немного рискованной, а результат зависит от порядка, в котором были прикреплены обработчики событий.

В конкретном случае CancelEventArgs я думаю, что правильным шаблоном было бы установить Cancel в true или оставить его в покое, поэтому порядок не должен иметь значения.

1 голос
/ 03 марта 2009

Протестировано:

public static void Main() {
    Event += (sender, e) => e.Cancel = true;
    Event += (sender, e) => e.Cancel = false;
    Event += (sender, e) => e.Cancel = true;

    var args = new CancelEventArgs();
    Event(null, args);

    WL(args.Cancel);
}

static event EventHandler<CancelEventArgs> Event;

Порядок подключенных обработчиков событий имеет значение.

Вообще говоря, события с неизменяемыми аргументами событий и многоадресными делегатами не должны использоваться вместе, но .NET Framework использует такие события очень широко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...