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
4

3 回答 3

8

这与计时器无关。

您正在 UI 线程上运行长时间(网络绑定)操作。
每当代码在 UI 线程上运行时,UI 都无法响应。

您需要异步或在后台线程上运行该操作。

于 2013-06-19T17:29:08.887 回答
1

万一您仍然不明白 Slacks 的答案...

  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 线程,但是我建议远离计时器我会直接调用线程

于 2013-06-26T21:05:08.463 回答
0

如果函数内部有 for 循环或 while 循环,您也可以尝试在 Timer1_Tick 函数的循环中使用 Application.DoEvents()。

于 2013-06-20T18:56:59.257 回答