Вопрос относительно к значению/ссылочному типу событий

На MSDN я нашел следующее:

public event EventHandler<MyEventArgs> SampleEvent;

public void DemoEvent(string val)
{
// Copy to a temporary variable to be thread-safe.
    EventHandler<MyEventArgs> temp = SampleEvent; 

Действительно ли это - ссылка?
Раз так я не понимаю его значение как тогда, когда SampleEvent стал пустым, временный файл - также

    if (temp != null)
        temp(this, new MyEventArgs(val));
}
11
задан Petr 8 April 2010 в 09:09
поделиться

1 ответ

Это паранойя, связанная с потоками. Если другой поток отменит подписку на последний обработчик сразу после того, как вы проверили его на null , он может стать null , и вы вызовет исключение. Поскольку делегаты неизменяемы, запись снимка делегата в переменную предотвращает это.

Конечно, у него есть другой побочный эффект, что вы можете (вместо этого) в конечном итоге инициировать событие для объекта, который считает, что он уже отписался ...

Но подчеркнем - это только проблема, когда несколько потоков подписываются / отменяют подписку на объект, что a: редко и b: не совсем желательно.

12
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

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