Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Копирование обработчика события перед вызовом. Зачем?

9.7K
10 июля 2012 года
Vitamant
228 / / 07.02.2011
Доброго времени суток!

Недавно увидел в коде такую вот конструкцию:

 
Код:
public void OnEvent(EventArgs e)
{
    EventHandler<EventArgs> handler = SomeEventHandler;
    if (handler != null)
        handler(this, e);
}
Подскажите - для чего копируется обработчик событий? Приложение мультипоточное, но разве подобный код имеет смысл?

---

Понял, благодарю! :)
297
10 июля 2012 года
koodeer
1.2K / / 02.05.2009
Потому что в другом потоке может быть произведена отписка от события.
Если просто написать:
 
Код:
if (SomeEventHandler != null)
        SomeEventHandler(this, e);
То отписка может произойти сразу после проверки на нуль. Чтобы избежать этого, нужно либо лочить данный кусок кода (что работает медленно), либо делать копирование.

Например, здесь это описано (в комментариях кода, по-английски).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог