使用多线程控制 Form1 上的 Label 显示,相关代码如下:
'声明委托
Delegate Sub DelegateThreadTask()
'局部变量:
Private thread_DisplayControl As Thread, delegate_DisplayControl As DelegateThreadTask
'开始按钮
Private Sub btnBegin_Click(sender As Object, e As EventArgs) Handles btnBegin.Click
thread_DisplayControl = New Thread(AddressOf ThreadDisplayControl) '实例一下线程
thread_DisplayControl.Start() '线程开始
End Sub
'终止按钮
Private Sub btnAbort_Click(sender As Object, e As EventArgs) Handles btnAbort.Click
thread_DisplayControl.Abort() '线程终止
End Sub
'线程
Private Sub ThreadDisplayControl()
Debug.WriteLine("线程里调用委托")
delegate_DisplayControl = New DelegateThreadTask(AddressOf SubDisplayControl)
Invoke(delegate_DisplayControl)
Debug.WriteLine("委托结束啦!")
End Sub
'委托调用
Private Sub SubDisplayControl()
Do
'每隔1秒钟,循环更新Form1上的Label信息
lblControl.Text = Now
Delay(1000) '延时函数
Loop
End Sub
然后按开始按钮,执行后线程根本停不下来(或者说线程可以停下来,但线程调用的委托停不下来)。。
本人菜鸟,请教高手。。
------解决方案--------------------
你自己的线程中就不应该有什么循环、阻塞。
如果你想用低级的Timer,那么就用现成的。自己设计的应该是更高级的分层系统。
应该重新审查你自己的设计逻辑。
------解决方案--------------------
给你几个建议。
1.不要再Invoke里阻塞线程,尤其是调用Thread.Sleep或者等待线程同步对象(比如锁)
2.要终止一个线程,最好由线程自行退出。
对于你的情况可以像这样处理:
在类级别定义一个标志字段,指示线程是否需要终止
Dim NeedStop As Boolean = False
把循环和等待放到线程里进行,每次循环体检查线程是否需要终止,如果是,停止循环,做清理工作后退出
Do Until NeedStop
Invoke(Sub()
lblText.Text = ""
End Sub)
Delay(1000)
Loop
'其他清理工作
------解决方案--------------------
线程的方法跑完了它就终止了。
在.net框架下,不需要过多考虑资源释放的问题。CLR已经帮你都做了。