如何使计时器不冻结程序

时间:2013-06-19 17:24:59

标签: vb.net timer

当我在一个过程中启动计时器时,它会冻结我的程序。有什么办法可以解决吗?为了在定时器工作时不冻结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

3 个答案:

答案 0 :(得分:8)

这与计时器无关。

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

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

答案 1 :(得分: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线程,但是我会重新考虑远离定时器,我会直接调用线程

答案 2 :(得分:0)

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