Tôi có một câu hỏi phong cách về lựa chọn triển khai chuỗi nền tôi nên sử dụng trên một ứng dụng biểu mẫu cửa sổ. Hiện tại tôi có một số BackgroundWorker
trên biểu mẫu có vòng lặp vô hạn (while(true))
. Trong vòng lặp này, tôi sử dụng WaitHandle.WaitAny
để giữ cho luồng tạm ẩn cho đến khi có điều gì đó quan tâm xảy ra. Một trong những sự kiện xử lý mà tôi chờ đợi là sự kiện "StopThread
" để tôi có thể thoát ra khỏi vòng lặp. Sự kiện này được báo hiệu khi từ của tôi bị ghi đè Form.Dispose()
.BackgroundWorker vs background Chủ đề
Tôi đọc ở đâu đó rằng BackgroundWorker
thực sự dành cho các thao tác mà bạn không muốn kết nối giao diện người dùng và có kết thúc hữu hạn - như tải xuống tệp hoặc xử lý chuỗi các mục. Trong trường hợp này, "kết thúc" không xác định và chỉ khi cửa sổ đóng. Do đó, tôi có thể sử dụng Chủ đề nền thay vì BackgroundWorker
cho mục đích này?
một vấn đề khác mà tôi không chắc chắn là, giả sử tôi đang cố gắng hủy bỏ biểu mẫu có nhân viên nền đang chạy trên đó. Tôi báo hiệu shutdownevent (ManualResetEvent) và đôi khi sau đó DoWork sẽ thoát ra một cách duyên dáng.Tôi có nên để biểu mẫu tiếp tục và Vứt bỏ ngay cả khi DoWork có thể mất nhiều thời gian hơn để hoàn thành hoặc có cách nào đó (và tốt hơn) cho luồng.Cho nhân viên nền cho đến khi nó thực sự thoát và sau đó để Dispose của biểu mẫu tiếp tục? –
Tôi nghĩ rằng BackgroundWorker.IsBusy là những gì bạn đang tìm kiếm ở đó. – ParmesanCodice
Chỉ sử dụng 'CancelAsync' (và kiểm tra cho' CancellationPending' nếu chuỗi của bạn sẽ được bỏ phiếu trong khoảng thời gian ngắn, nếu bạn muốn có ngoại lệ được nêu ra, hãy sử dụng 'System.Threading.Thread.Abort()'. Trong chính chuỗi khối, chọn đúng kiểu cho tình huống –