Нужно ли делать locker'ы для событий C#?
Если да, то как?
Источник: Stack Overflow на русском
Если да, то как?
Событие состоит из поля-делегата и пары методов для того чтобы подписываться и отписываться. Эти методы можно не писать - в этом случае компилятор сам их сгенерирует, и они при вызове будут автоматически блокировать ссылку на текущий объект (или на текущий тип, если событие статическое).
Но конструкция вида if (this.Event1 != null) this.Event1(this, EventArgs.Empty);
не является потокобезопасной, так как между проверкой и обращением к делегату единственный обработчик в другом потоке может отписаться. Для предотвращения этого рекомендуется взять эту конструкцию в lock(this)
.
Но в реальности я не сталкивался с тем, чтобы в такой блокировке была необходимость.