【问题标题】:Compact Framework: Timer.Dispose is not blockingCompact Framework:Timer.Dispose 没有阻塞
【发布时间】:2010-11-04 00:31:25
【问题描述】:

更新:定时器是一个 System.Threading.Timer。

我们有一个在 Timer Tick 上更新的 UI 控件。在处置我们的控制时,我们调用 timer.Dispose()。当 UI 控件被调用后定时器触发时,我们偶尔会遇到 ObjectDisposedOExceptions。

我在msdn docs看到这个:

“调用 Dispose() 方法重载后可能会发生回调,因为计时器将回调排队等待线程池线程执行。您可以使用 Dispose(WaitHandle) 方法重载等待所有回调完成。”

但是,Compact Framework 无法访问该重载方法。

这种情况的最佳解决方法是什么?有没有办法让我们的 Dispose 方法阻塞,直到计时器完全释放?其他建议?

谢谢!

【问题讨论】:

    标签: compact-framework timer dispose


    【解决方案1】:

    我不确定阻止 Dispose 是否是个好主意。有很多事情可能会出错,从而使事情处于不干净的状态。

    我会改为检查您的计时器回调中的控件是否为空。或者,您可以将计时器回调放在 try 块中并捕获 ObjectDisposedException ,但这会消耗更多资源(抛出/捕获异常非常昂贵。)

    这应该只发生在线程池中的线程耗尽之前,如果计时器发出几次信号但由于控件为空而没有做任何工作,这听起来没有真正的问题。

    【讨论】:

    • 我们尝试检查控件是否在回调中被释放。这并没有帮助——我们可以告诉我们,当我们实际上在回调方法中时,控件已经被释放了。
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2013-08-19
    • 1970-01-01
    • 2017-07-30
    • 2013-08-10
    相关资源
    最近更新 更多