2009-02-25 24 views

Trả lời

84

Đơn giản: Không khởi động BackgroundWorker hai lần.

Bạn có thể kiểm tra nếu nó vẫn đang chạy bằng cách sử dụng các IsBusy tài sản, vì vậy chỉ cần thay đổi mã này:

worker.RunWorkerAsync(); 

này:

if(!worker.IsBusy) 
    worker.RunWorkerAsync(); 
else 
    MessageBox.Show("Can't run the worker twice!"); 

Cập nhật:

Nếu bạn làm thực sự cần khởi chạy nhiều tác vụ nền cùng một lúc, bạn có thể chỉ cần tạo nhiều đối tượng BackgroundWorker

+0

Ở một mức độ nào đó, tôi đồng ý rằng câu trả lời không hoàn toàn hữu ích. Với trường hợp bạn * làm * cần chạy hai quy trình nền, sẽ không tuyệt vời nếu gặp lỗi thay vì nói "Không thể chạy nhân viên hai lần". Tôi sẽ giả định câu trả lời về việc chạy backgroundWorkers mới cho mỗi tác vụ - hoặc theo cách nào đó xếp hàng công việc là giải pháp tốt hơn, điều đó sẽ không khiến bạn phải kiểm tra xem một số phần khác của hệ thống đã bắt đầu công việc nền hay chưa uppon đó. – Thies

51

Tạo đối tượng BackgroundWorker mới cho mỗi thao tác mà bạn muốn thực hiện. Ví dụ, chứ không phải là:

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
for (int i; i < max; i++) { 
    worker.RunWorkerAsync(i); 
} 

Hãy thử điều này:

for (int i; i < max; i++) { 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    worker.RunWorkerAsync(i); 
} 
+0

Đó là một câu trả lời tuyệt vời. Làm thế nào để chúng ta giết tất cả các backgroundWorkers nếu được yêu cầu? –

+0

@VladSpreys Tôi thực sự không thể thảo luận về hủy bỏ chỉ trong một bình luận, nhưng có một số bài viết thực sự tốt trên trang này về chủ đề này. –

+0

@ fatcat1111 cảm ơn bạn. Tôi hiểu ý tưởng hủy bỏ chủ đề nếu chúng ta giữ một tham chiếu đến nó. Nhưng với đoạn mã này, chúng tôi không có. –

5

tôi sẽ nhìn vào queue'ing các nhiệm vụ mà cần phải được thực hiện. Bạn nhận được những ưu điểm sau;

  • Bạn không cần phải xử lý các vấn đề về nhiệm vụ nền không thể bắt đầu do cái gì khác đang chạy
  • Bạn không cần phải lo lắng về việc sử dụng quá nhiều chủ đề, bằng cách tạo ra một nền tảng mới làm việc cho mỗi công việc.
  • Cuối cùng, hàng đợi có thể cho phép bạn đảm bảo rằng các tác vụ nền chạy theo cùng thứ tự như chúng được tạo/yêu cầu.

Dưới đây là ví dụ về triển khai: http://thevalerios.net/matt/2008/05/a-queued-backgroundworker. Tôi không chắc chắn nếu việc thực hiện trong threadsafe, và tôi sẽ cập nhật câu trả lời của tôi một khi tôi tìm ra vấn đề khóa hiện tại của tôi trong một thực hiện tôi đang làm việc với.

+0

Đây là một cách tiếp cận tuyệt vời khi yêu cầu đa luồng –

Các vấn đề liên quan