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()中
 不知道为什么

解决方案 »

  1.   

    不太明白你的意图,你的G过程是空的。
    如果你是要在后台线程中,去读取ListView的内容,那么可以这么做:
    Private Sub G()
       //试试看这里可以读取到listview2的内容吗?
    End Sub   

  2.   

    我的意思是这段代码 GetCars.IsAlive 始终为true,
    While (GetCars.IsAlive) 一直在循环,程序陷入假死
    我本想在 
    While (GetCars.IsAlive)
      Thread.Sleep(2000)
      End While后执行某些操作
      

  3.   

      Private Sub GetCarsStart()
      If Me.ListView2.InvokeRequired Then
      Me.ListView2.Invoke(New ThreadStart(AddressOf G))
      End If
      End Sub
    你试试这样呢...
      

  4.   

    Invoke改成BeginInvoke,Invoke需要等待委托完成才返回,而接受委托的线程正在While (GetCars.IsAlive)...
    应该是死锁了
      

  5.   

    问题是 我需要的是同步,等待GetCarsStart 读取 listview的值
      

  6.   

    改成定时检查,或者在循环中加入DoEvents。
      

  7.   

    While (GetCars.IsAlive)
      Thread.Sleep(2000)
      End While这个循环干脆删掉。因为你根本不需要等。你线程执行完毕后,并没有要做的事情。直接不要这个循环效果一样,如果你要等线程结束。可以改为While (GetCars.IsAlive)
        Application.DoEvents()
    End While
      

  8.   

    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)'休眠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很好。