To subscribe to events by using an anonymous method



· Use the addition assignment operator (+=) to attach your anonymous method to the event. In the following example, assume that an object named publisher has an event named RaiseCustomEvent and that a CustomEventArgs class has also been defined to carry some kind of specialized event information. Note that the subscriber class needs a reference to publisher in order to subscribe to its events.

publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e) { string s = o.ToString() + " " + e.ToString(); Console.WriteLine(s); };

· It is important to notice that you cannot easily unsubscribe from an event if you used an anonymous method to subscribe to it. To unsubscribe in this scenario, go back to the code where you subscribe to the event, store the anonymous method in a delegate variable, and then add the delegate to the event.

Unsubscribing

To prevent your event handler from being invoked when the event is raised, unsubscribe from the event. In order to prevent resource leaks, you should unsubscribe from events before you dispose of a subscriber object. Until you unsubscribe from an event, the multicast delegate that underlies the event in the publishing object has a reference to the delegate that encapsulates the subscriber's event handler. As long as the publishing object holds that reference, garbage collection will not delete your subscriber object.

To unsubscribe from an event

· Use the subtraction assignment operator (-=) to unsubscribe from an event:

publisher.RaiseCustomEvent -= HandleCustomEvent;

· When all subscribers have unsubscribed from an event, the event instance in the publisher class is set to null.


Подписка на события при помощи анонимного метода

· Чтобы присоединить анонимный метод к событию, используйте оператор назначения сложения (+=). В следующем примере предположим, что объект с именем publisher имеет событие с именем RaiseCustomEvent, и что класс CustomEventArgs также был определен и содержит некие относящиеся к событию сведения. Обратите внимание, что для класса подписчика требуется ссылка на publisher, чтобы подписаться на его события.

ß-----

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

Отмена подписки

Чтобы предотвратить вызов обработчика событий при инициировании события, подписку на событие необходимо отменить. Во избежание утечки ресурсов отменять подписку на события следует до удаления объекта подписчика. До тех пор, пока подписка на событие не отменена, делегат многоадресной рассылки, лежащий в основе события в публикующем объекте, будет ссылаться на делегата, инкапсулирующего обработчик событий подписчика. Если ссылка присутствует в публикующем объекте, объект подписчика не будет удален при сборке мусора.

Отмена подписки на событие

· Чтобы отменить подписку на событие, воспользуйтесь оператором назначения вычитания (-=).

publisher.RaiseCustomEvent -= HandleCustomEvent;

· Если подписка на событие отменена для всех подписчиков, экземпляр события в классе издателя получает значение null.

 


How to: Publish Events that Conform to .NET Framework Guidelines

The following procedure demonstrates how to add events that follow the standard .NET Framework pattern to your own classes and structs. All events in the .NET Framework class library are based on the EventHandler delegate, which is defined as follows:

public delegate void EventHandler(object sender, EventArgs e);
Note:
The .NET Framework 2.0 introduces a generic version of this delegate, EventHandler<(Of <(TEventArgs>)>). The following examples show how to use both versions.

Although events in classes that you define can be based on any valid delegate type, even delegates that return a value, it is generally recommended that you base your events on the .NET Framework pattern by using EventHandler, as shown in the following example.

 


Дата добавления: 2019-03-09; просмотров: 208; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!