По моему мнению, если что-то из этого является проблемой, как управление потоками, так и управление жизненным циклом объектов безрассудны и требуют пересмотра.
В первом примере код не является симметричным: BeginInvoke
не будет ждать завершения action
, но прямой вызов будет; это, наверное, уже ошибка.
Если вы ожидаете, что еще один поток потенциально удастся утилизировать элемент управления, с которым вы работаете, у вас нет другого выбора, кроме как перехватить ObjectDisposedException
- и он не может быть выдан, пока вы уже не внутри action
, и, возможно, не в текущей теме благодаря BeginInvoke
.
Неправильно предполагать, что, как только вы отменили подписку на событие, вы больше не будете получать уведомления о нем. Для этого даже не требуется нескольких потоков - только несколько подписчиков. Если первый подписчик делает что-то во время обработки уведомления, в результате чего второй подписчик отменяет подписку, уведомление, находящееся в данный момент «в полете», все равно будет отправлено второму подписчику. Возможно, вам удастся смягчить это с помощью защитного предложения в верхней части подпрограммы обработчика событий, но вы не можете остановить его.