当我在进程中启动计时器时,它会冻结我的程序。有什么办法可以解决吗?让它在计时器工作时不会冻结 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 都无法响应。
您需要异步或在后台线程上运行该操作。
万一您仍然不明白 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 线程,但是我建议远离计时器我会直接调用线程
如果函数内部有 for 循环或 while 循环,您也可以尝试在 Timer1_Tick 函数的循环中使用 Application.DoEvents()。