从foreach循环启动相同的线程不起作用

时间:2010-12-17 16:22:09

标签: vb.net foreach

有没有办法启动相同的Thread表单foreach循环

Sub
For Each lvItem As ListViewItem In _ListView.SelectedItems
    tThread = New Thread(AddressOf Me.myFunction())
    tThread .Start()
Next
End Sub


Sub myFunction()
//Code
End Sub

在我的情况下,当我从列表中选择一个项目时,它工作正常......但是当我选择多个文件时,它会起作用。

3 个答案:

答案 0 :(得分:1)

  

我想从ListView中选择多个文件(它们是文件路径)并将它们转换为mp3文件,但使用上述解决方案。它成功转换第一个选定的文件,但随后停止。

为每个文件创建单独的线程是次优的。在某些情况下,这实际上会导致更差性能,而不是按顺序执行它们,因为系统将花费太多时间在不同线程之间来回切换。相反,您希望选择少量线程并通过这些线程将项目排队等待时间。

有很多方法可以实现这个:

  • 您可以编写自定义代码,该代码基于物理处理器核心数量的线程数(大于2或核心数量 - 1是常见的)。这是一项额外的工作,而且容易出错。
  • 您可以使用ThreadPool.QueueUserWorkItem()中的内置功能。这很棒,但跟踪项目进度可能很棘手。
  • 您可以使用Task Parallel Library。这需要.Net 4,但它可能是你迄今为止最好的选择。预先学习概念的额外工作也将是一个巨大的回报,而且听起来微软正在围绕任务概念建立.Net 5中一些更重要的功能。

答案 1 :(得分:0)

我猜测而不是让一个变量tThread存储线程,你可能意味着要存储所有线程,所以相反它们有List个。如下所示:

Sub
    Dim threads as New List(Of Thread)
    For Each lvItem As ListViewItem In _ListView.SelectedItems
        tThread = New Thread(AddressOf Me.myFunction())
        tThread .Start()
        threads.Add(tThread)
    Next
End Sub

否则,如果还有其他问题,请提供更多详细信息。

答案 2 :(得分:0)

您确定选中了这些项目吗?我在listview中尝试了以下几个项目,它按预期工作。

Private Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button2.Click

    For Each lvItem As ListViewItem In ListView1.SelectedItems
        Dim t As Threading.Thread = New Threading.Thread(AddressOf myFunction)
        t.Start(lvItem)
    Next

End Sub

Private Sub myFunction(ByVal lvi As Object)
    Dim lvItem As ListViewItem = CType(lvi, ListViewItem)
    Debug.WriteLine(lvItem.Text)
End Sub