Нужно ли делать locker'ы для событий C#?

Рейтинг: 1Ответов: 1Опубликовано: 11.05.2011

Если да, то как?

Ответы

▲ 7

Событие состоит из поля-делегата и пары методов для того чтобы подписываться и отписываться. Эти методы можно не писать - в этом случае компилятор сам их сгенерирует, и они при вызове будут автоматически блокировать ссылку на текущий объект (или на текущий тип, если событие статическое).

Но конструкция вида if (this.Event1 != null) this.Event1(this, EventArgs.Empty); не является потокобезопасной, так как между проверкой и обращением к делегату единственный обработчик в другом потоке может отписаться. Для предотвращения этого рекомендуется взять эту конструкцию в lock(this).

Но в реальности я не сталкивался с тем, чтобы в такой блокировке была необходимость.