【问题标题】:How can I iterate over a listview in a background thread?如何在后台线程中迭代列表视图?
【发布时间】:2011-08-18 02:55:22
【问题描述】:

我有一个带有 ListView 的应用程序,我想遍历 ListView 中的每个项目。但我想在单独的线程中执行此操作。

这是一个非常简单的代码版本——但它的错误是一样的:

Private Sub StartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartToolStripMenuItem.Click
    pingThread = New Thread(AddressOf loopingRoutine)
    pingThread.Start()
End Sub

Public Sub loopingRoutine()
    For Each item As ListViewItem In ListView1.Items
        MsgBox(item.Text)
    Next
End Sub

这会导致以下错误:

跨线程操作无效:控件“ListView1”从创建它的线程以外的线程访问。

为什么会这样?我以前在使用 DataGridViews 时从未遇到过这个问题。

谁能解释一下?

【问题讨论】:

    标签: vb.net multithreading listview


    【解决方案1】:

    您不能从后台线程访问 WinForms 项目。它们与 UI 线程有关联。如果您过去能够使用不同的类型执行此操作,那么您很不幸它起作用了。

    当您想要使用特定控件时,您需要 Invoke 返回 UI 线程以访问它的成员。在后台线程上执行诸如循环成员之类的操作是不可能的。

    【讨论】:

    • 非常感谢...我打算去研究多线程,所以我明白了。
    【解决方案2】:

    有办法!希望我可以帮助其他人通过网络尝试解决这个问题!

    您需要使用委托线程调用项目并将它们存储为列表。然后使用它...如果有意义的话!

    像这样:

        Private Sub StartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartToolStripMenuItem.Click
        pingThread = New Thread(AddressOf loopingRoutine)
        pingThread.Start()
    End Sub
    
    Public Sub loopingRoutine()
        Dim myList = DirectCast(Invoke(New GetListViewDelegate(AddressOf GetListViewItems)), List(Of String))
        For Each item As String In myList
            Dim array() As String = item.Split(";")
            MsgBox(array(0) & vbCrLf & array(1))
        Next
    End Sub
    
    Private Delegate Function GetListViewDelegate() As List(Of String)
    Public Function GetListViewItems() As List(Of String)
        Return the list back to the delegate
        Dim pathList = New List(Of String)
        For Each item As ListViewItem In ListView1.Items
            pathList.Add(item.Text & ";" & item.Index)
        Next
        Return pathList
    End Function
    

    这可能不是最好的方法 - 但对于一个快速而肮脏的程序来说,它应该足够了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多