Pertimbangkan metode hipotetis dari suatu objek yang melakukan hal-hal untuk Anda:
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
Bagaimana seseorang bisa menunggu BackgroundWorker dilakukan?
Di masa lalu orang telah mencoba:
while (_worker.IsBusy)
{
Sleep(100);
}
Tapi ini kebuntuan , karena IsBusy
tidak dibersihkan sampai setelah RunWorkerCompleted
acara ditangani, dan kejadian itu tidak bisa ditangani sampai aplikasi idle. Aplikasi tidak akan menganggur sampai pekerja selesai. (Plus, ini adalah lingkaran sibuk - menjijikkan.)
Yang lain menambahkan saran untuk memasukkannya ke:
while (_worker.IsBusy)
{
Application.DoEvents();
}
Masalah dengan itu adalah yang Application.DoEvents()
menyebabkan pesan saat ini dalam antrian untuk diproses, yang menyebabkan masalah re-entrancy (.NET tidak kembali masuk).
Saya berharap dapat menggunakan beberapa solusi yang melibatkan objek sinkronisasi acara, di mana kode menunggu sebuah acara - yang RunWorkerCompleted
diatur oleh penangan acara pekerja . Sesuatu seperti:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, RunWorkerCompletedEventArgs e)
{
_workerDoneEvent.SetEvent();
}
Tapi saya kembali ke jalan buntu: event handler tidak bisa berjalan sampai aplikasi idle, dan aplikasi tidak akan idle karena menunggu Event.
Jadi bagaimana Anda bisa menunggu BackgroundWorker selesai?
Pembaruan Orang-orang tampaknya bingung oleh pertanyaan ini. Mereka tampaknya berpikir bahwa saya akan menggunakan BackgroundWorker sebagai:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += MyWork;
worker.RunWorkerAsync();
WaitForWorkerToFinish(worker);
Artinya tidak , itu adalah tidak apa yang saya lakukan, dan itu tidak apa yang diminta di sini. Jika itu masalahnya, tidak akan ada gunanya menggunakan pekerja latar belakang.