Snippet

Základy práce s BackgroundWorkerem

Přidáno: 23.7.2009       Kategorie: VB.NET - Komponenty       Autor: Jan Novák

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 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.