Základy práce s BackgroundWorkerem
Přidáno: 23.7.2009
Kategorie: VB.NET - Komponenty
Autor: Tomáš Hübelbauer
Názorná ukázka použtí komponenty Windows.Forms.BackgroundWorker.
Formulář:
http://img30.imageshack.us/img30/7693/86393908.png
Tlačítko Cancel má Enabled=False. BackgroundWorker má ReportsProgress a SupportsCancelation obojí True.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim files As New List(Of String)(IO.Directory.GetFiles(My.Computer.FileSystem.SpecialDirectories.Desktop))
BackgroundWorker1.RunWorkerAsync(files)
ProgressBar1.Maximum = files.Count
Button1.Enabled = False
Button2.Enabled = True
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
If Not TypeOf e.Argument Is List(Of String) Then
Throw New ArgumentException("Only acceptable type of input is System.Collection.Generic.List(Of String).")
End If
Dim files As List(Of String) = DirectCast(e.Argument, List(Of String))
For i As Integer = 0 To files.Count - 1
If Not IO.File.Exists(files(i)) Then
BackgroundWorker1.ReportProgress(i, New With {.Scanned = 0, .Result = "File not found!", .File = files(i)})
Else
For j As Integer = 0 To 99
Threading.Thread.Sleep(10)
If BackgroundWorker1.CancellationPending Then
BackgroundWorker1.ReportProgress(0, New With {.Scanned = 0, .Result = "Canceled.", .file = i.ToString() & " files scanned."})
Exit Sub
End If
BackgroundWorker1.ReportProgress(i, New With {.Scanned = j, .Result = "Scanning...", .File = files(i)})
Next
End If
Next
BackgroundWorker1.ReportProgress(files.Count, New With {.Scanned = 0, .Result = "Done!", .File = "Scanning was successful."})
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage
Dim data = e.UserState
GroupBox1.Text = data.Result.ToString()
Label1.Text = data.File.ToString()
ProgressBar2.Value = CInt(data.Scanned)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = "Dir to be scanned: " & My.Computer.FileSystem.SpecialDirectories.Desktop.ToString()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
BackgroundWorker1.CancelAsync()
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Button1.Enabled = True
Button2.Enabled = False
End Sub
End Class