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
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 Buka Kotak Alat, klik tab Komponen, lalu seret komponen ke BackgroundWorker formulir Anda.
Komponen
backgroundWorker1
muncul di Baki Komponen.Di jendela Properti , setel properti WorkerSupportsCancellation ke
true
.Di jendela Properti , klik tombol Peristiwa , lalu klik DoWork dua kali peristiwa dan RunWorkerCompleted untuk membuat penanganan aktivitas.
Masukkan kode yang memakan waktu Anda ke dalam penanganan DoWork aktivitas.
Ekstrak parameter apa pun yang diperlukan oleh operasi dari Argument properti DoWorkEventArgs parameter .
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
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
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
Di Formulir Windows Designer, klik
startButton
dua kali untuk membuat penanganan Click aktivitas.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
Di Formulir Windows Designer, klik
cancelButton
dua kali untuk membuat penanganan Click aktivitas.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
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
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.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
Terapkan formulir yang melaporkan kemajuan sebagai operasi asinkron berlanjut. Untuk informasi selengkapnya, lihat Cara: Menerapkan Formulir yang Menggunakan Operasi Latar Belakang.
Terapkan kelas yang mendukung Pola Asinkron untuk Komponen. Untuk informasi selengkapnya, lihat Menerapkan Pola Asinkron berbasis Peristiwa.
Baca juga
.NET Desktop feedback
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk