Hallo ihr lieben
Ich möchte in meiner Anwendung eine Backupfunktion einbauen. Dabei sollen einfach verschiedene Dateien gezippt werden.
Die Zip Funktion des Frameworks habe ich verstanden und der Code ist fertig.
Nun soll das zipen aber (wenn möglich) im Hintergrund passieren - also dass mit dem Programm weiter gearbeitet werden kann.
Dazu setze ich mich gerade mit dem Background Worker auseinander (zum ersten mal).
Zum verstehen habe ich eine kleine Testanweisung geschrieben, welche eine einstellbare Menge Textdateien auf dem Desktop (im Unterordner: txtFiles) erstellt.
Während der Erstellung, wird eine Progressbar mit dem Prozentualen Status angezeigt. <-- Funktioniert
Außerdem soll ein Listview mit den Dateinamen, sowie ein Label mit Datei x von y angezeigt werden. <-- funktioniert nur halb
und das abbrechen des Vorgangs, soll durch ein Button Klick möglich sein.
So generell ist mir das alles gelungen, aber es funktioniert nur, wenn ich im DoWork Event des Background workers eine Verzögerung einbaue (
wenn ich diese Zeile (49) auskommentiere, funktioniert der Code und die Progressbar aktualisiert sich. Der Rest der Form ist aber wie eingefroreren.
Also so, als würde ich das normal linear abarbeiten.
Ist das normal, oder habe ich einen Fehler eingebaut?
Spoiler anzeigen
Ich möchte in meiner Anwendung eine Backupfunktion einbauen. Dabei sollen einfach verschiedene Dateien gezippt werden.
Die Zip Funktion des Frameworks habe ich verstanden und der Code ist fertig.
Nun soll das zipen aber (wenn möglich) im Hintergrund passieren - also dass mit dem Programm weiter gearbeitet werden kann.
Dazu setze ich mich gerade mit dem Background Worker auseinander (zum ersten mal).
Zum verstehen habe ich eine kleine Testanweisung geschrieben, welche eine einstellbare Menge Textdateien auf dem Desktop (im Unterordner: txtFiles) erstellt.
Während der Erstellung, wird eine Progressbar mit dem Prozentualen Status angezeigt. <-- Funktioniert
Außerdem soll ein Listview mit den Dateinamen, sowie ein Label mit Datei x von y angezeigt werden. <-- funktioniert nur halb
und das abbrechen des Vorgangs, soll durch ein Button Klick möglich sein.
So generell ist mir das alles gelungen, aber es funktioniert nur, wenn ich im DoWork Event des Background workers eine Verzögerung einbaue (
System.Threading.Thread.Sleep(100)
)wenn ich diese Zeile (49) auskommentiere, funktioniert der Code und die Progressbar aktualisiert sich. Der Rest der Form ist aber wie eingefroreren.
Also so, als würde ich das normal linear abarbeiten.
Ist das normal, oder habe ich einen Fehler eingebaut?
VB.NET-Quellcode
- Public Class frmMain
- Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
- BackgroundWorker1.CancelAsync()
- End Sub
- Private Sub btncreateFiles_Click(sender As Object, e As EventArgs) Handles btncreateFiles.Click
- 'Listview und Label löschen
- LVtxtProcessed.Items.Clear()
- LBLMessage.Text = ""
- ' Backgroundworker starten
- If NUDtxtAmount.Value > 0 Then
- BackgroundWorker1.RunWorkerAsync(CInt(NUDtxtAmount.Value))
- Else
- MessageBox.Show("es gibt nichts zu tun")
- End If
- End Sub
- Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object,
- ByVal e As System.ComponentModel.DoWorkEventArgs) _
- Handles BackgroundWorker1.DoWork
- Dim txtPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\txtFiles\"
- If Not IO.Directory.Exists(txtPath) Then IO.Directory.CreateDirectory(txtPath)
- Dim streami As System.IO.FileStream
- Dim txtAmount As Integer = DirectCast(e.Argument, Integer)
- For i = 1 To txtAmount
- ' Abbrechen wenn Cancel-Button gedrück wurde erlauben
- If BackgroundWorker1.CancellationPending Then
- e.Cancel = True
- Return
- End If
- 'txt Datei erstellen
- Dim txtFilename As String = "Textdatei " & i & ".txt"
- streami = System.IO.File.Create(txtPath & txtFilename)
- Dim cfile As System.IO.StreamWriter = New System.IO.StreamWriter(streami, System.Text.Encoding.Default)
- cfile.WriteLine("Textdatei " & i.ToString)
- cfile.Close()
- ' Fortschritt in Prozent melden und Datei übergeben
- BackgroundWorker1.ReportProgress(CInt((i) * 100 / (txtAmount + 1)), New Object() {txtFilename, i.ToString, txtAmount.ToString})
- 'ggf. System schlafen legen, um aktualisierung zu erreichen
- System.Threading.Thread.Sleep(100)
- Next
- End Sub
- Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
- Handles BackgroundWorker1.ProgressChanged
- 'Paramter abfragen
- Dim obj As Object() = DirectCast(e.UserState, Object())
- Dim txtFileName As String = obj(0).ToString()
- Dim i As String = obj(1).ToString()
- Dim txtAmount As String = obj(2).ToString()
- ' erstellte txt in Listview ausgeben
- Dim item As System.Windows.Forms.ListViewItem
- item = LVtxtProcessed.Items.Add(LVtxtProcessed.Items.Count.ToString, txtFileName, "")
- ' Status in Progressbbar ausgeben
- ProgressBar1.Value = e.ProgressPercentage
- 'Messagebox aktualisieren
- LBLMessage.Text = "Datei " & i & " von " & txtAmount & " erstellt."
- End Sub
- End Class