2

在 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 应用程序中的表单时,它不会被添加到表单的 IContainer 组件字段中,因此当表单被 dispose()d 时,它不会得到 auto-dispose()d。

为什么不支持这个?

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

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

我应该更喜欢哪个?如果我忘记执行这两个操作之一,则 Timer 将永远存在,使我的表单保持活动状态(因为 Timer 无法被 GC,并且它包含对我表单的 Timer_Tick() 方法的引用,因此表单永远不会被 GC )。

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

4

1 回答 1

3

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

我对此的推理如下:

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