Компактный каркас: Timer.Dispose не блокирует - PullRequest
1 голос
/ 04 ноября 2010

ОБНОВЛЕНИЕ: Таймер - это System.Threading.Timer.

У нас есть элемент управления пользовательского интерфейса, который обновляется по таймеру.При избавлении от нашего контроля мы вызываем timer.Dispose ().Мы сталкиваемся со случайными исключениями ObjectDisposedOException, когда таймер срабатывает после того, как был активирован элемент управления пользовательским интерфейсом.

Я вижу это в документах msdn :

Перегрузка метода Dispose () вызвана, поскольку таймер ставит в очередь обратные вызовы для выполнения потоками пула потоков. Вы можете использовать перегрузку метода Dispose (WaitHandle), чтобы дождаться завершения всех обратных вызовов. "

Однако CompactFramework не имеет доступа к этому перегруженному методу.

Как лучше всего обойти эту ситуацию?Есть ли способ заблокировать наш метод Dispose, пока таймер не будет полностью удален?Другие предложения?

Спасибо!

1 Ответ

0 голосов
/ 04 ноября 2010

Я не уверен, что было бы неплохо заблокировать Dispose. Есть ряд вещей, которые могут пойти не так, что может оставить вещи в нечистом состоянии.

Я бы вместо этого проверил, является ли элемент управления нулевым в вашем обратном вызове таймера. В качестве альтернативы вы можете поместить свой обратный вызов таймера в блок try и перехватить исключение ObjectDisposedException, но это потребует гораздо больше ресурсов (создание / отлов исключений очень дорогой).

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

...