您的位置:首页 > 编程语言 > VB

VB.net使用多线程与委托解决时间延迟的问题

2010-12-16 14:46 507 查看
问题的来由:

设置保存后,希望有提示“已保存”,并在提示出现后,延时5秒,随后提示自动消失

就是下文中Label7.text的显示变成""

最早是希望用thread.sleep 来解决的,最简单:

Private Sub main()
Label7.Text = "已保存"
Threading.Thread.Sleep(5000)
Label7.Text = ""
End Sub


但是会造成页面无反应,假死5秒,相当不爽

直接使用 DoEvents() ,也会假死:

Private Sub main()
Label7.Text = "已保存"
Dim tmpNow As Date = Now
While Now.Subtract(tmpNow).Seconds < 5 '5秒后消失
Windows.Forms.Application.DoEvents()
End While
Label7.Text = ""
End Sub


随后考虑使用100毫秒的时间间隔,使用 Sleep 配合 DoEvents

Private Sub main()
Label7.Text = "已保存"
Dim i As Integer
i = 50
While i > 0
Threading.Thread.Sleep(100)
Windows.Forms.Application.DoEvents()
i = i - 1
End While
Label7.Text = ""
End Sub


发现效果还行。只是在点击文本框的时候,需要点击2次,只能说还是略有遗憾。

最后使用了threading.thread.timer,使用多线程,并因为timer不能在多线程下控制窗口控件,于是采用委托,解决问题

Imports System
Imports System.Threading

Private Sub main()
Label7.Text = "已保存"
Dim tcb As New TimerCallback(AddressOf Me.TimerMethod)
Dim objTimer As Timer
objTimer = New Timer(tcb, Nothing, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0)) '延迟5秒开始执行,间隔xx秒重复执行,0为不重复执行
Label7.Text = ""
End Sub

Public Sub TimerMethod(ByVal state As Object)
Invoke(New DelegateSub(AddressOf SetText), "") '此处新建委托并执行
End Sub

Public Delegate Sub DelegateSub(ByVal text As String)'定义一个委托

Public Sub SetText(ByVal text As String) '此处是接受委托,执行函数
Label7.Text = text
End Sub
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐