DoWork běží v jiném vlákně ať je ve formuláři nebo v modulu, kde navíc nemá ponětí o listview a počtu jeho items, navíc si způsobíš problémy s illegal cross thread calls. Pokud je cílem opakované použití nebylo by lepší použít vlastní třídu než modul nebo podědit backgroundworkrer? Události ProgressChanged a RunWorkerCompleted vrací zpracování zpět do vlákna, kde je formulář, ale zde máš komplet úplně vše zcela běžně v DoWork. Cesty ke kopírování můžeš přece předat skrzeva argument jako string array nebo list(of string):
Private WithEvents bw As BackgroundWorker
Private Structure BackgroundWorkerArguments
Public source_files() As String
Public destination As String
Sub New(ByVal source() As String, ByVal destination As String)
source_files = source
destination = destination
End Sub
End Structure
Sub RunWorkerJob(source() As String, destination As String)
bw = New BackgroundWorker
bw.WorkerReportsProgress = True
bw.RunWorkerAsync(New BackgroundWorkerArguments(source, destination))
End Sub
Private Sub bw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
Dim bwa As BackgroundWorkerArguments = e.Argument
For i = 0 To bwa.source_files.GetUpperBound(0)
'copy only
bw.ReportProgress(i, bwa.source_files(i))
Next
End Sub
Private Sub bw_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged
'update progress
Debug.Print(String.Format("{0},{1}", e.ProgressPercentage, e.UserState))
End Sub
Private Sub bw_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
'completed
Debug.Print("Completed")
bw = Nothing
End Sub
|