Запуск того же потока из цикла foreach не работает - PullRequest
0 голосов
/ 17 декабря 2010

Есть ли способ запустить ту же форму потока foreach loop

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 ]

1 голос
/ 18 декабря 2010

Я хочу выбрать несколько файлов (которые являются путями к файлам) из ListView и преобразовать их в mp3-файлы, но с вышеупомянутым решением. он успешно преобразует первый выбранный файл, но затем останавливается.

Создание отдельного потока для каждого файла является неоптимальным. В некоторых случаях это может фактически привести к худшей производительности, чем выполнение их всех последовательно, потому что ваша система будет тратить слишком много времени на переключение между различными потоками. Вместо этого вы хотите выбрать небольшое количество потоков и поставить эти элементы в очередь на время.

Есть много способов реализовать это:

  • Вы можете написать собственный код, который основывает количество потоков на количестве ядер физических процессоров (больше 2 или количество ядер - 1 обычно). Это много дополнительной работы и подвержено ошибкам.
  • Вы можете использовать встроенный в ThreadPool.QueueUserWorkItem(). Это замечательно, но может быть сложно отслеживать прогресс ваших предметов.
  • Вы можете использовать параллельная библиотека задач . Для этого требуется .Net 4, но это, вероятно, ваш лучший вариант на сегодняшний день. Дополнительная работа по предварительному изучению концепций также будет огромной отдачей, и похоже, что Microsoft использует некоторые из наиболее важных функций в .Net 5 вокруг концепции «Задача».
0 голосов
/ 17 декабря 2010

Вы уверены, что товары выбраны?Я попробовал следующее с несколькими элементами в списке, и это сработало, как и ожидалось.

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
0 голосов
/ 17 декабря 2010

Я предполагаю, что вместо одной переменной 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

В противном случае, если есть другая проблема, пожалуйста, предоставьте более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...