Share via


BackgroundWorker.DoWork Kejadian

Definisi

Terjadi ketika RunWorkerAsync() dipanggil.

public:
 event System::ComponentModel::DoWorkEventHandler ^ DoWork;
public event System.ComponentModel.DoWorkEventHandler DoWork;
public event System.ComponentModel.DoWorkEventHandler? DoWork;
member this.DoWork : System.ComponentModel.DoWorkEventHandler 
Public Custom Event DoWork As DoWorkEventHandler 

Jenis Acara

Contoh

Contoh kode berikut menunjukkan penggunaan DoWork peristiwa untuk memulai operasi asinkron. Contoh kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk BackgroundWorker kelas .

// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, 
    DoWorkEventArgs e)
{   
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub

Keterangan

Kejadian ini dimunculkan saat Anda memanggil RunWorkerAsync metode . Di sinilah Anda memulai operasi yang melakukan pekerjaan yang berpotensi memakan waktu.

Kode Anda di penanganan DoWork aktivitas harus secara berkala memeriksa CancellationPending nilai properti dan membatalkan operasi jika itu adalah true. Ketika ini terjadi, Anda dapat mengatur Cancel bendera System.ComponentModel.DoWorkEventArgs ke true, dan Cancelled bendera System.ComponentModel.RunWorkerCompletedEventArgs di penanganan aktivitas Anda RunWorkerCompleted akan diatur ke true.

Perhatian

Ketahuilah bahwa kode Anda di penanganan DoWork aktivitas dapat menyelesaikan pekerjaannya karena permintaan pembatalan sedang dibuat, dan perulangan polling Anda mungkin melewatkan CancellationPending diatur ke true. Dalam hal ini, Cancelled bendera System.ComponentModel.RunWorkerCompletedEventArgs di penanganan aktivitas Anda RunWorkerCompleted tidak akan diatur ke true, meskipun permintaan pembatalan dibuat. Situasi ini disebut kondisi balapan dan menjadi perhatian umum dalam pemrograman multithreaded. Untuk informasi selengkapnya tentang masalah desain multithreading, lihat Praktik Terbaik Utas Terkelola.

Jika operasi Anda menghasilkan hasil, Anda dapat menetapkan hasilnya ke DoWorkEventArgs.Result properti . Ini akan tersedia untuk penanganan RunWorkerCompleted aktivitas di RunWorkerCompletedEventArgs.Result properti .

Jika operasi memunculkan pengecualian yang tidak ditangani kode Anda, BackgroundWorker akan menangkap pengecualian dan meneruskannya ke RunWorkerCompleted penanganan aktivitas, di mana kode tersebut diekspos sebagai Error properti dari System.ComponentModel.RunWorkerCompletedEventArgs. Jika Anda berjalan di bawah debugger Visual Studio, debugger akan berhenti pada titik di DoWork penanganan aktivitas tempat pengecualian yang tidak tertangani dinaikkan. Jika Anda memiliki lebih dari satu BackgroundWorker, Anda tidak boleh mereferensikan salah satu dari mereka secara langsung, karena ini akan menggabungkan penanganan aktivitas Anda DoWork ke instans tertentu dari BackgroundWorker. Sebagai gantinya, Anda harus mengakses dengan BackgroundWorker mentransmisikan sender parameter di penanganan aktivitas Anda DoWork .

Anda harus berhati-hati agar tidak memanipulasi objek antarmuka pengguna apa pun di penanganan aktivitas Anda DoWork . Sebagai gantinya, komunikasikan ke antarmuka pengguna melalui BackgroundWorker peristiwa.

Untuk informasi selengkapnya tentang cara menangani peristiwa, lihat Menangani dan Menaikkan Peristiwa.

Berlaku untuk

Lihat juga