06 November 2015

VB.NET: BackgroundWorker Control


Control BackgroundWorker menjalankan code dibelakang layar, tanpa mempengaruhi form yang mengeksekusi perintah. Sering dipakai untuk proses import/export data atau eksekusi code lain yang membutuhkan waktu lama. Setelah beres eksekusi code, BackgroundWorker akan mengembalikan hasil nya ke form.

BackgroundWorker ada di Toolbox-> All Windows Form, seperti pada gambar berikut:


Untuk lebih jelas tentang penggunaan control ini, mari kita buat aplikasi dengan loop (putaran) yang memakan waktu cukup lama sebagai berikut:

UI:
BackgroundWorker tidak akan ditampilkan di form melaikan di bagian bawah (area abu-abu). Tambahkan sebuah textbox untuk menampilkan "putaran ke-", button 1 untuk memulai putaran, dan button 2 untuk cancel proses. Kita juga menambahkan progress bar.

Code:
Keterangan kode pada comment berwarna hijau.

Imports System.ComponentModel

Public Class Form1

 Dim iMax As Integer = 200 'iterasi maksimal

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    'untuk mencegah error saat background proses mengubah UI
    Control.CheckForIllegalCrossThreadCalls = False

    With BackgroundWorker1
        .WorkerReportsProgress = True 'catat nilai progress
        .WorkerSupportsCancellation = True 'supaya bisa cancel
    End With

    'setting nilai maksimum progress bar
    ProgressBar1.Maximum = iMax

    'UI Teks untuk button
    Button1.Text = "Start"
    Button2.Text = "Cancel"
 End Sub

 Private Sub Button1_Click(sender As Object, e
As EventArgs) _
         Handles Button1.Click
    'Menjalankan proses background
    BackgroundWorker1.RunWorkerAsync()
 End Sub

 Private Sub Button2_Click(sender As Object, e
As EventArgs) _
         Handles Button2.Click
    'Membatalkan proses background
    BackgroundWorker1.CancelAsync()
    BackgroundWorker1.Dispose()
 End Sub

 Private Sub BackgroundWorker1_DoWork(sender As Object, _
             e As System.ComponentModel.DoWorkEventArgs) _

             Handles BackgroundWorker1.DoWork
    'mulai iterasi
    For i = 0 To iMax
        'handle jika ada cancel
        If BackgroundWorker1.CancellationPending = True Then
            e.Cancel = True
            Exit For
        Else

            'proses normal tanpa cancel
            TextBox1.Text = i 'menampilkan iterasi ke pada textbox
            'mengirim progress iterasi
            BackgroundWorker1.ReportProgress(i)
            'supaya proses berhenti sejenak 1000 milidetik = 1 detik
            System.Threading.Thread.Sleep(1000)
        End If
    Next
 End Sub


 Private Sub BackgroundWorker1_ProgressChanged(sender As Object, _
            e As ProgressChangedEventArgs) _

            Handles BackgroundWorker1.ProgressChanged
    ProgressBar1.Value = e.ProgressPercentage
 End Sub

 Private Sub
BackgroundWorker1_RunWorkerCompleted(sender As Object, _
            e As RunWorkerCompletedEventArgs) _

            Handles BackgroundWorker1.RunWorkerCompleted
    If e.Cancelled = True Then
        MsgBox("Proses Dibatalkan")
    Else
        MsgBox("Proses Selesai")
    End If

 End Sub

End Class


Runtime:
Jalankan program dan klik tombol Start.

Jika saat proses berjalan kita klik tombol cancel maka proses akan berhenti dan muncul pesan berikut:

Sementara jika kita biarkan sampai proses selesai, akan muncul pesan berikut.


Click here if you like this article.


0 comments: