2010-12-17 4 views
0

Arbeits Gibt es eine Möglichkeit gleiche Gewindeform foreach Schleifeselber Thread von einer foreach-Schleife startet nicht

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 

In meinem Fall zu starten, wenn ich ein Element aus der Liste auswählen, wird es funktioniert gut ... aber wenn Ich wähle mehr als eine Datei aus, die nicht funktioniert.

Antwort

1

Ich mag mehrere Dateien auswählen (die Dateipfade sind) von Listview und wandeln sie in MP3-Dateien, aber mit obiger Lösung. Es konvertiert die erste ausgewählte Datei erfolgreich, stoppt dann jedoch.

Das Erstellen eines separaten Threads für jede Datei ist nicht optimal. In einigen Fällen kann dies sogar dazu führen, dass sie alle nacheinander ausgeführt werden, weil Ihr System zu viel Zeit damit verbringen wird, zwischen verschiedenen Threads hin- und herzuwechseln. Stattdessen möchten Sie eine kleine Anzahl von Threads auswählen und Ihre Elemente für diese Threads in die Warteschlange stellen.

Es gibt viele Möglichkeiten, dies zu implementieren:

  • Sie können benutzerdefinierte Code schreiben, der die Anzahl der Threads auf die Anzahl der physischen Prozessorkerne (größer 2 oder die Anzahl der Kerne stützt - 1 verbreitet). Dies ist eine Menge zusätzlicher Arbeit und ist fehleranfällig.
  • Sie können das eingebaute in ThreadPool.QueueUserWorkItem() verwenden. Das ist großartig, aber es kann schwierig sein, den Fortschritt Ihrer Artikel zu verfolgen.
  • Sie können die Task Parallel Library verwenden. Dies erfordert .Net 4, aber es ist wahrscheinlich Ihre beste Option bei weitem. Die zusätzliche Arbeit im Vorfeld der Konzepte wird auch eine große Belohnung sein, und es klingt wie Microsoft basiert einige der wichtigsten Funktionen in .Net 5 um das Task-Konzept.
0

Ich vermute, dass anstelle einer Variablen tThread Speichern des Threads wahrscheinlich alle Threads zu speichern, so haben Sie stattdessen eine List von ihnen. So etwas wie:

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 

Andernfalls, wenn es ein anderes Problem gibt, bitte liefern Sie weitere Details.

+0

Ich möchte mehrere Dateien (die Dateipfade) aus ListView auswählen und sie in MP3-Dateien konvertieren, aber mit der obigen Lösung. Es konvertiert die erste ausgewählte Datei erfolgreich, stoppt dann jedoch. –

+0

@ m.qayyum: In deinem Code sendest du eigentlich keine Dateipfade zu 'myFunction', also woher weiß er, welche Pfade? Ist es möglich, dass der Code in 'myFunction' die Pfade von sich selbst erfasst und es etwas Falsches gibt, dass es den gleichen Pfad für jeden Thread bekommt? –

0

Sind Sie sicher, dass die Elemente ausgewählt sind? Ich habe Folgendes mit ein paar Elementen in der Listenansicht versucht und es hat wie erwartet funktioniert.

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