如何在Compact Framework上处理Forms.Timer

时间:2011-02-22 12:24:47

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

在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组件字段中,因此在表单处置时它不会获得auto-dispose()d( )d。

为什么不支持?

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

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

我更喜欢哪一个?如果我忘记执行这两个中的一个,Timer将永远存在,保持我的表单活着(因为Timer不能被GC,并且它持有对我的表单的Timer_Tick()方法的引用,所以表单永远不会被GC )。

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

1 个答案:

答案 0 :(得分:3)

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

我的理由如下:

  • 使用设计师代码通常是一个坏主意,所以你的第一个选项有代码味道
  • 手动将它添加到组件集合中非常容易让未来的开发人员(甚至在几个月内自己)不明白为什么会出现并被砍掉。
  • 我一般不喜欢“混合”对象初始化。如果分析者正在对对象进行初始化,则需要对其执行 all none ,而不是仅仅部分。当代码被维护时或在重用期间有人做副本时,让它做一些部分工作是致命的。粘贴到其他一些课程中。