Rubrik: Variablen/Strings | VB-Versionen: VB.NET | 25.07.06 |
Parameter an Backgroundworker übergeben (VB 2005) Dieser Tipp zeigt anhand eines Beispiels, wie Sie "Parameter" an die Backgroundworker-Ereignisse DoWork und ProgressChanged übergeben. | ||
Autor: Carsten Stuplich | Bewertung: | Views: 27.329 |
ohne Homepage | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Dieser Tipp zeigt anhand eines Beispiels, wie Sie "Parameter" an die Backgroundworker-Ereignisse DoWork und ProgressChanged übergeben. So können Sie innerhalb des ProgessChanged-Ereignisses z.B. eine Listview mit den Parametern die so vom DoWork-Ereignis aus übergeben haben befüllen.
In unserem Beispiel sollen die Dateien eines Ordners in einem Listview aufgelistet werden.
Da der Backgroundworker mit den Variablen „Pfad“ und „Dateityp“ aufgerufen werden soll, hab ich im Deklartionsbereich die UDT „TypeSucheParameter“ erstellt:
Structure TypeSuchParameter Dim Pfad As String Dim Dateityp As String End Structure
Und nun der Aufruf des Background-Workers mit unserer UDT:
Private Sub btnSearch_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSearch.Click Dim SuchUDT As TypeSuchParameter With SuchUDT .Pfad = txtFolder.Text .Dateityp = cmbType.SelectedItem ' Wenn kein Datentyp angegeben wurde, ' dann *.* als Wildcard verwenden If .Dateityp = Nothing Then .Dateityp = "*.*" ' Prüfen ob ein Ordner angegeben wurde If .Dateityp = "" Then MessageBox.Show("Bitte wählen Sie zu erst einen Ordner aus.", _ "Ordner noch auswählen", MessageBoxButtons.OK, _ MessageBoxIcon.Stop) Exit Sub End If End With ' Liste löschen ListView1.Items.Clear() ' Backgroundworker mit Pfad als Parameter starten BackgroundWorker1.RunWorkerAsync(SuchUDT) End Sub
Und nun das DoWork Ereignis, in der wir mit Hilfe der Funktion „DirectCast“ die übergebene UDT auslesen:
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _ ByVal e As System.ComponentModel.DoWorkEventArgs) _ Handles BackgroundWorker1.DoWork ' Hinweis: Im Ereignisses "DoWork" können Sie nicht auf Forms zugreifen Dim i As Integer ' Übergebene UDT (enthält Pfad und Wildcard) auslesen ' (der 2te Parameter muss dem Typ der zu setzenden Variable ' entsprechen - Hier "TypeSuchParameter") Dim tmpSucheUDT As TypeSuchParameter = DirectCast(e.Argument, _ TypeSuchParameter) ' Wenn Sie nur einen String übergeben anstatt einem UDT wird ' dieser wie folgt ausgelesen: ' Dim BeipsielString As String = DirectCast(e.Argument, String) ' Dateien in diesem Ordner ermitteln Dim Dateien() As String = Directory.GetFiles(tmpSucheUDT.Pfad, _ tmpSucheUDT.Dateityp) ' Jetzt die Namen der Dateien einzeln an das Ereignis ' "ProgressChanged" übergeben. For Each Datei As String In Dateien ' Abbrechen wenn Cancel-Button gedrück wurde erlauben If BackgroundWorker1.CancellationPending Then e.Cancel = True Return End If ' Fortschritt in Prozent melden und Datei übergeben ' (Zum Prozentwert wird 1 Addiert, um Fehler "Division ' durch 0" zu verhindern, ' wenn keine Datei gefunden wurde) BackgroundWorker1.ReportProgress((i + 1) * 100 / _ (Dateien.Length + 1), Datei) i += 1 Next End Sub
Die gefundenen Dateien (inkl. Pfad) wurden im DoWork-Ereignis an das ProgressChanged-Ereignis über die Variable „Datei“ übergeben.
Diese lesen wir nun im ProgresssChanged-Ereignis wieder mittels der Funktion „DirectCast“ aus und geben diese in einer ListView aus:
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _ ByVal e As System.ComponentModel.ProgressChangedEventArgs) _ Handles BackgroundWorker1.ProgressChanged Dim Datei As String = DirectCast(e.UserState, String) ' Gefundene Datei in Listtview ausgeben Dim itemX As System.Windows.Forms.ListViewItem itemX = ListView1.Items.Add(ListView1.Items.Count.ToString, Datei, "") ' Status in Progressbbar ausgeben ToolStripProgressBar1.Value = e.ProgressPercentage End Sub