2012-10-30 32 views
5

Tôi đang cố gắng tìm ra một cách để xác minh rằng a thread BackgroundWorker là còn sống (tức là vẫn chạy Các chủ đề cơ bản được thực hiện như một vòng lặp vô hạn đơn giản:.IsBusy của BackgroundWorker có giống với "IsAlive" không?

while (AllConditionsMet()) 
{ 
    DoSomeMagic(); 
    Thread.Sleep(10000); 
} 

Điều gần gũi nhất với IsAlive() tôi tìm thấy cho đến nay là IsBusy bất động sản, nhưng cho rằng giấc ngủ thread của tôi() s hầu hết thời gian, tôi không chắc chắn liệu điều này sẽ làm công việc

tôi có thể đếm trên IsBusy làm:.

if (!myWorker.IsBusy) 
    RestartWorker(); 

hoặc tôi đang gọi cho sự cố?

+1

nếu isBusy là sai Backgroundworker không làm một công việc, vì vậy bạn không gặp rắc rối bằng cách sử dụng mã hiển thị. Chỉ có phương thức "RestartWorker()" là sai, bởi vì Worker chưa được bắt đầu. Nhưng đó là một điều ngôn ngữ hơn là một vấn đề lập trình. – jAC

+2

Bạn đang yêu cầu sự cố nếu bạn triển khai mã trong chuỗi để tự khởi động lại. Bạn sẽ được tốt hơn, phát hiện một điều kiện thất bại, kết thúc tha đề và khởi động lại một chủ đề hoàn toàn mới. Nếu không, bạn rất có thể có một tình huống bế tắc. –

Trả lời

12

BackgroundWorker.IsBusy là đúng miễn là trình xử lý sự kiện DoWork bận Trình xử lý sự kiện RunWorkerCompleted chưa được chạy. Do lưu ý mệnh đề thứ hai, bất động sản không không cho bạn biết nếu vòng lặp của bạn đang hoạt động.

Hơn nữa, có một tình trạng đua khá khó chịu trong đoạn mã thứ hai của bạn. IsBusy có thể đúng trong câu lệnh if() nhưng giả là một nano giây sau đó. Loại cuộc đua tấn công mỗi tháng một lần. Mục đích của mã khó có thể hiểu được từ các đoạn mã khó để giải quyết. Hãy xem xét luôn luôn tạo ra một đối tượng BGW mới, mà sẽ không bao giờ chạy đua. Cũng giúp thoát khỏi vòng lặp đó, một thread ngủ trong 10 giây là lãng phí một nguồn tài nguyên hệ thống rất tốn kém khi không làm gì cả. Và nó nướu lên lập lịch trình threadpool.

4

Từ docs:

đúng, nếu BackgroundWorker đang chạy một hoạt động không đồng bộ; nếu không, false.

Bất kể nếu bạn ngủ các sợi nhân hay không, nó vẫn còn làm một cái gì đó để sử dụng IsBusy nên được tốt.

5

Để đảm bảo Backgroundworker thực sự dừng lại, bạn có thể tự xóa nó theo cách thủ công. Đặt yourBackgroundWorker.WorkerSupportsCancellation = true;. Sau đó chỉ cần ngăn chặn BackgroundWorker với:

yourBackgroundWorker.CancelAsync(); 

Tuy isBusy nên là đủ để phát hiện một hoạt động/Ví dụ làm việc của BackgroundWorker của bạn.