我有一个带有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之前触发!! ?
非常感谢你的时间。 萨迈赫
答案 0 :(得分:1)
您的计时器通常使用构造函数创建,并且在表单实际准备好显示之前不会调用Load事件。
您应该创建一个自定义构造函数,接受您是否使用计时器的参数。
答案 1 :(得分:1)
您在表单的InitializeComponent中声明和初始化您的计时器,在表单构造函数中调用。这会立即启动您的计时器,然后退出表单构造函数,然后在表单显示(引发Form_Load事件)之前,分配的间隔通过。
如果在磁盘上的虚拟内存中交换了空闲应用程序,则可能会增加这种情况。物理内存中的重新加载需要更多时间
您可以测试我的假设,减少间隔值
您应该在表单加载事件之前获得更多Timer_Tick事件。