Public Delegate Sub ReadListView()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim GetCars As Thread = New Thread(New ThreadStart(AddressOf GetCarsStart))
GetCars.Name = "Main"
GetCars.Start()
While (GetCars.IsAlive)
Thread.Sleep(2000)
End While
End Sub
Private Sub GetCarsStart()
If Me.ListView2.InvokeRequired Then
Me.ListView2.Invoke(New ReadListView1(AddressOf G))
End If
End Sub
Private Sub G() End Sub
这样线程main始终停留在GetCarsStart()中
不知道为什么
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim GetCars As Thread = New Thread(New ThreadStart(AddressOf GetCarsStart))
GetCars.Name = "Main"
GetCars.Start()
While (GetCars.IsAlive)
Thread.Sleep(2000)
End While
End Sub
Private Sub GetCarsStart()
If Me.ListView2.InvokeRequired Then
Me.ListView2.Invoke(New ReadListView1(AddressOf G))
End If
End Sub
Private Sub G() End Sub
这样线程main始终停留在GetCarsStart()中
不知道为什么
如果你是要在后台线程中,去读取ListView的内容,那么可以这么做:
Private Sub G()
//试试看这里可以读取到listview2的内容吗?
End Sub
While (GetCars.IsAlive) 一直在循环,程序陷入假死
我本想在
While (GetCars.IsAlive)
Thread.Sleep(2000)
End While后执行某些操作
If Me.ListView2.InvokeRequired Then
Me.ListView2.Invoke(New ThreadStart(AddressOf G))
End If
End Sub
你试试这样呢...
应该是死锁了
Thread.Sleep(2000)
End While这个循环干脆删掉。因为你根本不需要等。你线程执行完毕后,并没有要做的事情。直接不要这个循环效果一样,如果你要等线程结束。可以改为While (GetCars.IsAlive)
Application.DoEvents()
End While
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim GetCars As Thread = New Thread(New ThreadStart(AddressOf GetCarsStart))'创建线程
GetCars.Name = "Main"
GetCars.Start()'启动线程
While (GetCars.IsAlive)'如果线程没有结束则循环
Thread.Sleep(2000)'休眠2秒
End While
'当这个按钮的事件执行到这里后,退出此方法,也就才能结束当前堆栈调用,回到消息循环继续执行
'所以,这个方法没执行完之前,消息循环是被阻塞的,而下面的Me.ListView2.Invoke就是通过SendMessage发送消息
'来实现线程和界面的同步,这里不结束,那么Me.ListView2.Invoke就一直要等待消息被执行,否则就是你现在的情况
End Sub
Private Sub GetCarsStart()
If Me.ListView2.InvokeRequired Then
Me.ListView2.Invoke(New ReadListView1(AddressOf G))
End If
End SubPrivate Sub G()End Sub你有多种方式解决目前问题:
1。按我上面说的在while循环中主动的调用Application.DoEvents()来执行消息循环,保证线程同步ui线程可以成功返回。
2。Me.ListView2.Invoke换为Me.ListView2.BeginInvoke,因为BeginInvoke同样是发消息,但是不等返回结果的,这样就会发一堆的消息在消息队列的末端,等线程结束后,你的while循环就结束了,然后按钮的方法也结束了。回来处理消息循环的时候处理BegingInvoke的代码。不过这一点是理论上的,我没有做过测试,你可以试试,不过这样也不是很好的方法,方法1很好。