Form_Load事件(VB.NET)之前触发的计时器事件勾号

时间:2012-11-12 14:46:11

标签: .net vb.net winforms

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

我面临一个非常奇怪的情况,即使在触发form_load之前,有时会触发Timer_Tick事件,例如,应用程序最小化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之前触发!! ?

非常感谢你的时间。 萨迈赫

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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