Hãy xem xét một phương pháp giả định của một đối tượng thực hiện công cụ cho bạn:
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
Làm thế nào người ta có thể chờ đợi một BackgroundWorker được thực hiện?
Trong quá khứ mọi người đã thử:
while (_worker.IsBusy)
{
Sleep(100);
}
Nhưng sự bế tắc này , vì IsBusy
không được xóa cho đến khi RunWorkerCompleted
sự kiện được xử lý và sự kiện đó không thể được xử lý cho đến khi ứng dụng không hoạt động. Ứng dụng sẽ không hoạt động cho đến khi nhân viên hoàn thành. (Thêm vào đó, đó là một vòng lặp bận rộn - kinh tởm.)
Những người khác đã thêm đề xuất loại bỏ nó vào:
while (_worker.IsBusy)
{
Application.DoEvents();
}
Vấn đề với điều đó là Application.DoEvents()
nguyên nhân khiến các thông báo hiện tại trong hàng đợi được xử lý, gây ra sự cố nhập lại (.NET không được đăng ký lại).
Tôi hy vọng sẽ sử dụng một số giải pháp liên quan đến các đối tượng đồng bộ hóa Sự kiện, trong đó mã chờ một sự kiện - mà RunWorkerCompleted
bộ xử lý sự kiện của công nhân đặt. Cái gì đó như:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, RunWorkerCompletedEventArgs e)
{
_workerDoneEvent.SetEvent();
}
Nhưng tôi trở lại bế tắc: trình xử lý sự kiện không thể chạy cho đến khi ứng dụng không hoạt động và ứng dụng sẽ không hoạt động vì nó đang chờ một Sự kiện.
Vì vậy, làm thế nào bạn có thể chờ đợi một BackgroundWorker kết thúc?
Cập nhật Mọi người dường như bị nhầm lẫn bởi câu hỏi này. Họ dường như nghĩ rằng tôi sẽ sử dụng BackgroundWorker như:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += MyWork;
worker.RunWorkerAsync();
WaitForWorkerToFinish(worker);
Đó không phải là nó, đó không phải là những gì tôi đang làm, và đó không phải là những gì đang được hỏi ở đây. Nếu đó là trường hợp, sẽ không có điểm nào trong việc sử dụng một nhân viên nền.