【问题标题】:How to dispose of a Forms.Timer on the Compact Framework如何在 Compact Framework 上处理 Forms.Timer
【发布时间】:2011-07-01 23:22:14
【问题描述】:

在 Compact Framework 上,System.Windows.Forms.Timer 类不支持 system.componentmodel 构造函数:

支持新的 Timer():http://msdn.microsoft.com/en-us/library/aa335543(v=vs.71).aspx

不支持新计时器(IContainer 容器):http://msdn.microsoft.com/en-us/library/aa335544(v=vs.71).aspx

这意味着,当我在 CF 应用程序中将 Timer 添加到表单时,它不会被添加到表单的 IContainer components 字段中,因此当表单被 dispose() 时它不会得到 auto-dispose()d )d.

为什么不支持?

当我的表单被处置时,我应该如何最好地处置计时器?看来我有两个主要选择:

  • 将表单的 dispose() 方法从 .designer.cs 移到我的主 .cs 文件中,并在其中添加手动“_timer.dispose()”调用
  • 或在调用 InitializeComponent() 之后,在创建表单时手动将 Timer 对象添加到组件集合中

我应该更喜欢哪个?如果我忘记做这两个之一,定时器将永远存在,保持我的表单活着(因为定时器不能被 GCed,它包含对我表单的 Timer_Tick() 方法的引用,所以表单永远不能被 GCed )。

这个实现决定是否反映了我需要注意的关于计时器和在 CF 机器上处理的一些奇怪之处?

【问题讨论】:

    标签: compact-framework timer components dispose system.componentmodel


    【解决方案1】:

    我会投票给选项 3:不要通过表单设计器添加计时器;而是在代码中手动添加它并手动将其添加到组件集合中。

    我的推理如下:

    • 弄乱设计器代码通常是个坏主意,因此您的第一个选项有代码味道
    • 手动将其添加到组件集合中很容易让未来的开发人员(甚至几个月后的您自己)不明白它为什么存在并被砍掉。
    • 我一般不喜欢“混合”对象初始化。如果设计者正在初始化一个对象,它需要allnone,而不是只做一部分。在维护代码或在重用期间,当有人复制并粘贴到其他类时,让它做一些部分工作是致命的。

    【讨论】:

    • 谢谢,这是个好建议。我会这样做,但我仍然想知道为什么他们删除了 componentmodel 构造函数,因为 Timer 仍然继承自 Component。它是否表明了定时器在嵌入式设备上的工作方式?
    • 其实不只是 Timer,我认为大部分组件都没有 ComponentModel ctor。我刚刚检查了 InputPanel 并没有。我认为菜单也没有。我认为这只是这些项目在 CF 中实施的方式,无论好坏。 FWIW,我敢打赌,CF 开发人员多年来创建的 >90% 的计时器从未被 Disposed,并且这些应用程序运行,所以如果你忘记了,它可能不是杀手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2020-05-14
    • 2010-09-26
    • 2012-03-29
    相关资源
    最近更新 更多