0

我有一个带有 Timer 组件的 Windows 表单,默认情况下(设计)计时器已启用,但基于发送到表单的一些参数,我禁用了 form_load 上的计时器。

我面临一个非常奇怪的场景,Timer_Tick 事件有时甚至在 form_load 被触发之前被触发,例如,这发生在应用程序最小化 20 分钟,然后我打开应用程序并尝试打开新表单,尤其是在慢速系统上.

代码如下:

'=============== Code of the form with Timer
Public Sub OpenForm(SomeParams)
        'Set Form Properties
        Me.Show() 'Here the event Form_Load fired
End Sub

Private Sub Form_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  'Some Code ...
  Timer1.Enabled = False/ True 'Based True or false based on parameters
 'Code ...
End Sub

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  'Code here
  'The code raise error if form load is not fired, because need info from params ...
End Sub



'=============== Code in the calling form (MainForm)
'Calling the Form
dim obj As new Form1  'I think form this line the Timer1_Tick Fired, before load
obj.OpenForm(Params)

当引发异常时,我关闭已处理的异常并尝试再次打开表单,它打开表单时禁用了 Timer1。

我知道解决方案很简单,只需默认禁用计时器,然后根据参数启用,但我想知道为什么 Timer1_Tick 有时会在 OpenForm Sub 和 Form1_Load Sub 之前触发!?

非常感谢您的时间。萨梅

4

2 回答 2

1

您的计时器通常使用构造函数创建,并且在实际准备好显示表单之前不会调用 Load 事件。

您应该创建一个自定义构造函数,该构造函数接受您关于是否使用计时器的参数。

于 2012-11-12T22:22:24.270 回答
1

您在表单的 InitializeComponent 中声明并初始化计时器,在表单构造函数中调用。这会立即启动您的计时器,然后退出表单构造函数,在表单显示(引发 Form_Load 事件)之前,分配的时间间隔过去。
如果空闲应用程序在磁盘上的虚拟内存中被交换掉,这种情况可能会增加。在物理内存中重新加载需要更多时间。
您可以测试我的假设降低间隔值。
您应该在表单加载事件之前获得更多 Timer_Tick 事件。

于 2012-11-13T08:48:59.180 回答