當我在一個進程中啓動計時器時,它凍結了我的程序。有什麼方法可以解決它?在定時器工作時,不要凍結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
當我在一個進程中啓動計時器時,它凍結了我的程序。有什麼方法可以解決它?在定時器工作時,不要凍結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
這與計時器無關。
您正在UI線程上運行一個很長的(網絡綁定)操作。
無論何時在UI線程上運行代碼,UI都無法響應。
您需要異步或在後臺線程上運行該操作。
如果在函數內部有for-loop或while循環,您還可以嘗試在Timer1_Tick函數的循環內部使用Application.DoEvents()。
但是,如果花費很多時間......說......等待連接到郵件服務器,它仍然可以暫停很長時間。 – cHao
櫃面你還是不明白西褲答案...
實例線程
Public t1 As Threading.Thread
從您的計時器到線程調用。在子程序
Private Sub someTimer(sender As Object, e As EventArgs) Handles someTimer.Tick
t1 = New Thread(New ThreadStart(AddressOf SomeSubRoutine))
t1.Start()
end sub
運行電子郵件代碼
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
你做,也不會掛斷GUI線程,然而,我recoment從定時器避而遠之我會打電話線程直接
只需添加到SLaks答案,如果您使用.NET 4.5,則可以使用async命令(http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx) If你正在使用一個較低的版本,你將需要創建一個新的BackgroundWorker – Mataniko
@Mataniko:這不是真的;您也可以在早期版本中使用'SendAsync()'(EAP)。 – SLaks
沒錯,我錯過了他的計時器的實際內容與實際問題:使計時器不凍結。 – Mataniko