Bagikan melalui


Panduan: Menjalankan Operasi di Latar Belakang

Jika Anda memiliki operasi yang akan memakan waktu lama untuk diselesaikan, dan Anda tidak ingin menyebabkan penundaan di antarmuka pengguna Anda, Anda dapat menggunakan BackgroundWorker kelas untuk menjalankan operasi pada utas lain.

Untuk daftar lengkap kode yang digunakan dalam contoh ini, lihat Cara: Menjalankan Operasi di Latar Belakang.

Menjalankan operasi di latar belakang

  1. Dengan formulir Anda aktif di Formulir Windows Designer di Visual Studio, seret dua Button kontrol dari Kotak Alat ke formulir, lalu atur Name properti dan Text tombol sesuai dengan tabel berikut.

    Button Nama Teks
    button1 startBtn Mulai
    button2 cancelBtn Batalkan
  2. Buka Kotak Alat, klik tab Komponen, lalu seret komponen ke BackgroundWorker formulir Anda.

    Komponen backgroundWorker1 muncul di Baki Komponen.

  3. Di jendela Properti , setel properti WorkerSupportsCancellation ke true .

  4. Di jendela Properti , klik tombol Peristiwa , lalu klik DoWork dua kali peristiwa dan RunWorkerCompleted untuk membuat penanganan aktivitas.

  5. Masukkan kode yang memakan waktu Anda ke dalam penanganan DoWork aktivitas.

  6. Ekstrak parameter apa pun yang diperlukan oleh operasi dari Argument properti DoWorkEventArgs parameter .

  7. Tetapkan hasil komputasi ke Result properti .DoWorkEventArgs

    Ini akan tersedia untuk penanganan RunWorkerCompleted aktivitas.

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Do not access the form's BackgroundWorker reference directly.
        // Instead, use the reference provided by the sender parameter.
        BackgroundWorker bw = sender as BackgroundWorker;
    
        // Extract the argument.
        int arg = (int)e.Argument;
    
        // Start the time-consuming operation.
        e.Result = TimeConsumingOperation(bw, arg);
    
        // If the operation was canceled by the user,
        // set the DoWorkEventArgs.Cancel property to true.
        if (bw.CancellationPending)
        {
            e.Cancel = true;
        }
    }
    
    Private Sub backgroundWorker1_DoWork( _
    sender As Object, e As DoWorkEventArgs) _
    Handles backgroundWorker1.DoWork
    
       ' Do not access the form's BackgroundWorker reference directly.
       ' Instead, use the reference provided by the sender parameter.
       Dim bw As BackgroundWorker = CType( sender, BackgroundWorker )
       
       ' Extract the argument.
       Dim arg As Integer = Fix(e.Argument)
       
       ' Start the time-consuming operation.
       e.Result = TimeConsumingOperation(bw, arg)
       
       ' If the operation was canceled by the user, 
       ' set the DoWorkEventArgs.Cancel property to true.
       If bw.CancellationPending Then
          e.Cancel = True
       End If
    
    End Sub   
    
  8. Sisipkan kode untuk mengambil hasil operasi Anda di penanganan RunWorkerCompleted aktivitas.

    // This event handler demonstrates how to interpret
    // the outcome of the asynchronous operation implemented
    // in the DoWork event handler.
    private void backgroundWorker1_RunWorkerCompleted(
        object sender,
        RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            // The user canceled the operation.
            MessageBox.Show("Operation was canceled");
        }
        else if (e.Error != null)
        {
            // There was an error during the operation.
            string msg = String.Format("An error occurred: {0}", e.Error.Message);
            MessageBox.Show(msg);
        }
        else
        {
            // The operation completed normally.
            string msg = String.Format("Result = {0}", e.Result);
            MessageBox.Show(msg);
        }
    }
    
    ' This event handler demonstrates how to interpret 
    ' the outcome of the asynchronous operation implemented
    ' in the DoWork event handler.
    Private Sub backgroundWorker1_RunWorkerCompleted( _
    sender As Object, e As RunWorkerCompletedEventArgs) _
    Handles backgroundWorker1.RunWorkerCompleted
    
       If e.Cancelled Then
          ' The user canceled the operation.
          MessageBox.Show("Operation was canceled")
       ElseIf (e.Error IsNot Nothing) Then
          ' There was an error during the operation.
          Dim msg As String = String.Format("An error occurred: {0}", e.Error.Message)
          MessageBox.Show(msg)
       Else
          ' The operation completed normally.
          Dim msg As String = String.Format("Result = {0}", e.Result)
          MessageBox.Show(msg)
       End If
    End Sub   
    
  9. Mengimplementasikan metode TimeConsumingOperation.

    // This method models an operation that may take a long time
    // to run. It can be cancelled, it can raise an exception,
    // or it can exit normally and return a result. These outcomes
    // are chosen randomly.
    private int TimeConsumingOperation(
        BackgroundWorker bw,
        int sleepPeriod )
    {
        int result = 0;
    
        Random rand = new Random();
    
        while (!bw.CancellationPending)
        {
            bool exit = false;
    
            switch (rand.Next(3))
            {
                // Raise an exception.
                case 0:
                {
                    throw new Exception("An error condition occurred.");
                    break;
                }
    
                // Sleep for the number of milliseconds
                // specified by the sleepPeriod parameter.
                case 1:
                {
                    Thread.Sleep(sleepPeriod);
                    break;
                }
    
                // Exit and return normally.
                case 2:
                {
                    result = 23;
                    exit = true;
                    break;
                }
    
                default:
                {
                    break;
                }
            }
    
            if( exit )
            {
                break;
            }
        }
    
        return result;
    }
    
    ' This method models an operation that may take a long time 
    ' to run. It can be cancelled, it can raise an exception,
    ' or it can exit normally and return a result. These outcomes
    ' are chosen randomly.
    Private Function TimeConsumingOperation( _
    bw As BackgroundWorker, _
    sleepPeriod As Integer) As Integer
    
       Dim result As Integer = 0
       
       Dim rand As New Random()
       
         While Not bw.CancellationPending
             Dim [exit] As Boolean = False
    
             Select Case rand.Next(3)
                 ' Raise an exception.
                 Case 0
                     Throw New Exception("An error condition occurred.")
                     Exit While
    
                     ' Sleep for the number of milliseconds
                     ' specified by the sleepPeriod parameter.
                 Case 1
                     Thread.Sleep(sleepPeriod)
                     Exit While
    
                     ' Exit and return normally.
                 Case 2
                     result = 23
                     [exit] = True
                     Exit While
    
                 Case Else
                     Exit While
             End Select
    
             If [exit] Then
                 Exit While
             End If
         End While
       
       Return result
    End Function
    
  10. Di Formulir Windows Designer, klik startButton dua kali untuk membuat penanganan Click aktivitas.

  11. RunWorkerAsync Panggil metode di Click penanganan aktivitas untuk startButton.

    private void startBtn_Click(object sender, EventArgs e)
    {
        this.backgroundWorker1.RunWorkerAsync(2000);
    }
    
    Private Sub startButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles startBtn.Click
        Me.backgroundWorker1.RunWorkerAsync(2000)
    End Sub
    
  12. Di Formulir Windows Designer, klik cancelButton dua kali untuk membuat penanganan Click aktivitas.

  13. CancelAsync Panggil metode di Click penanganan aktivitas untuk cancelButton.

    private void cancelBtn_Click(object sender, EventArgs e)
    {
        this.backgroundWorker1.CancelAsync();
    }
    
    Private Sub cancelButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cancelBtn.Click
        Me.backgroundWorker1.CancelAsync()
    End Sub
    
  14. Di bagian atas file, impor namespace System.ComponentModel dan System.Threading.

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Threading;
    using System.Windows.Forms;
    
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Threading
    Imports System.Windows.Forms
    
  15. Tekan F6 untuk membangun solusi, lalu tekan Ctrl+F5 untuk menjalankan aplikasi di luar debugger.

    Catatan

    Jika Anda menekan F5 untuk menjalankan aplikasi di bawah debugger, pengecualian yang dinaikkan dalam TimeConsumingOperation metode tertangkap dan ditampilkan oleh debugger. Ketika Anda menjalankan aplikasi di luar debugger, BackgroundWorker menangani pengecualian dan menyimpannya di Error properti RunWorkerCompletedEventArgs.

  16. Klik tombol Mulai untuk menjalankan operasi asinkron, lalu klik tombol Batalkan untuk menghentikan operasi asinkron yang sedang berjalan.

    Hasil setiap operasi ditampilkan dalam MessageBox.

Langkah berikutnya

Baca juga