2012-11-12 83 views
0

我有一個帶有Timer組件的Windows窗體,默認情況下(設計)定時器已啓用,但是基於發送到表單的一些參數,我禁用了form_load上的定時器。在Form_Load事件(VB.NET)之前觸發了Timer事件標記

我正面臨一個非常奇怪的場景,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形式被禁用。我知道解決方案是微不足道的,只是使默認情況下禁用定時器,然後啓用基於PARAMS,但我想知道爲什麼Timer1_Tick有時在OpenForm Sub和Form1_Load Sub之前被解僱! ?

非常感謝您的時間。 Sameh

+0

Interval屬性的值是什麼? – Steve

+0

這是不尋常的,但不是不可能的。 DoEvents()或MessageBox將是很好的方式讓事件發生亂序。是的,解決方法很簡單。 –

+0

謝謝@Steve它是500毫秒 – Sameh

回答

1

您聲明並初始化窗體的InitializeComponent中的定時器,在窗體構造函數內調用。這會立即啓動您的計時器,然後退出窗體構造函數,並在窗體顯示之前(引發Form_Load事件)分配的時間間隔過去。
如果在磁盤上的虛擬內存中將空閒應用程序換掉,則可能會增加這種情況。在物理內存中重新加載需要更多時間。
你可以測試我的假設減少間隔值。
您應該在表單加載事件之前獲得更多的Timer_Tick事件。

+0

謝謝@Steve,正如你所描述的那樣,我將間隔減少到1,並且能夠重現,但是我從來不知道Timer_Tick在InitializeComponent或構造函數後面被解僱,這是我的代碼中的一個大錯誤該定時器默認啓用。非常感謝您的幫助。 – Sameh

1

您的計時器通常是使用構造函數創建的,並且直到窗體實際上已準備好顯示時才調用Load事件。

您應該創建一個自定義構造函數來接受您是否使用計時器的參數。

+0

謝謝@Jim,是的,這是另一個很好的解決方案,但實際上關鍵是定時器事件在構造函數中被觸發,我不知道這種明顯的想法,Steve在評論和答案,謝謝大家。 – Sameh

相關問題