2013-06-19 17 views
1

當我在一個進程中啓動計時器時,它凍結了我的程序。有什麼方法可以解決它?在定時器工作時,不要凍結GUI中的所有按鈕?如何讓計時器不凍結程序

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    Do somting...(I sending mail throught SMTP) 
End Sub 

回答

8

這與計時器無關。

您正在UI線程上運行一個很長的(網絡綁定)操作。
無論何時在UI線程上運行代碼,UI都無法響應。

您需要異步或在後臺線程上運行該操作。

+2

只需添加到SLaks答案,如果您使用.NET 4.5,則可以使用async命令(http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx) If你正在使用一個較低的版本,你將需要創建一個新的BackgroundWorker – Mataniko

+0

@Mataniko:這不是真的;您也可以在早期版本中使用'SendAsync()'(EAP)。 – SLaks

+0

沒錯,我錯過了他的計時器的實際內容與實際問題:使計時器不凍結。 – Mataniko

0

如果在函數內部有for-loop或while循環,您還可以嘗試在Timer1_Tick函數的循環內部使用Application.DoEvents()。

+0

但是,如果花費很多時間......說......等待連接到郵件服務器,它仍然可以暫停很長時間。 – cHao

1

櫃面你還是不明白西褲答案...

  1. 實例線程

    Public t1 As Threading.Thread 
    
  2. 從您的計時器到線程調用。在子程序

    Private Sub someTimer(sender As Object, e As EventArgs) Handles someTimer.Tick 
    t1 = New Thread(New ThreadStart(AddressOf SomeSubRoutine)) 
    t1.Start() 
    end sub 
    
  3. 運行電子郵件代碼

    sub Subroutine() 
    
    email code here // make sure that therer are no GUI or Main Thread calls else you have to get into delegates and invoke methods 
    
    end sub 
    
  4. 你做,也不會掛斷GUI線程,然而,我recoment從定時器避而遠之我會打電話線程直接