Я не помню, чтобы когда-либо возникало необходимость вызывать событие из оператора lock
.Но не трудно представить, что дела идут плохо.
Когда вы вызываете событие, вы откладываете выполнение на код, который может быть не вашим.Это особенно верно, если вы пишете какую-то библиотеку или фреймворк, например, который будет использоваться другими.Внутри обработчика событий у вас нет абсолютно никакого контроля над тем, что происходит.Обработчик события может запустить новый поток и дождаться его завершения (т. Е. Join()
), прежде чем вернуться.Если этот новый поток вызвал какую-то функцию, заблокированную в той же переменной, что и ваш lock
, бинго.Deadlock.
Но кроме этого, лучшая практика - минимизировать количество времени, которое вы проводите внутри lock
, чтобы уменьшить аспект блокировки.Если вы поднимаете событие внутри lock
, все ставки отключены.