当我在一个过程中启动计时器时,它会冻结我的程序。有什么办法可以解决吗?为了在定时器工作时不冻结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
答案 0 :(得分:8)
这与计时器无关。
您正在UI线程上运行长(网络绑定)操作 每当代码在UI线程上运行时,UI都无法响应。
您需要异步或在后台线程上运行该操作。
答案 1 :(得分:1)
如果你仍然不理解Slacks的回答......
实例化线程
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线程,但是我会重新考虑远离定时器,我会直接调用线程
答案 2 :(得分:0)
如果你在函数内部有for循环或while循环,你也可以尝试在Timer1_Tick函数的循环中使用Application.DoEvents()。