Có cách nào tiêu chuẩn để đóng ứng dụng "sạch" trong khi một số đối tượng WaitHandle
có thể đang ở trạng thái cuộc gọi chặn hiện tại tới WaitOne
không?Làm thế nào để bạn đóng một ứng dụng khi một số WaitHandle đang ở giữa một cuộc gọi đến WaitOne?
Ví dụ, có thể có một sợi nền được quay cùng một phương pháp như thế này:
while (_request.WaitOne())
{
try
{
_workItem.Invoke();
}
finally
{
OnWorkCompleted();
}
}
tôi thấy không có cách nào rõ ràng để định đoạt của chủ đề này mà không gọi Thread.Abort
(mà từ những gì tôi hiểu là nản lòng). Tuy nhiên, hãy gọi số Close
đối tượng _request
(số AutoResetEvent
) sẽ loại trừ một ngoại lệ.
Hiện tại, chuỗi đang chạy vòng lặp này có thuộc tính IsBackground
được đặt thành true
và do đó, ứng dụng xuất hiện để đóng đúng cách. Tuy nhiên, kể từ WaitHandle
thực hiện IDisposable
, tôi không chắc chắn nếu điều này được coi là kosher hoặc nếu đối tượng đó thực sự phải được xử lý trước khi thoát khỏi ứng dụng.
Đây có phải là thiết kế tồi không? Nếu không, kịch bản này thường được xử lý như thế nào?
Hoàn toàn hợp lý. Nhưng điều này có nghĩa rằng nó * không * OK chỉ đơn giản là có thread chạy vòng lặp này khởi tạo với 'IsBackground = true' (để khi ứng dụng thoát, vòng lặp kết thúc mặc dù' WaitHandle' vẫn đang chờ)? –
@Dan: Điều đó có thể không sao, nhưng phương pháp này sẽ cho phép bạn kết thúc một cách duyên dáng luồng mà không phải tắt toàn bộ ứng dụng. –
Xin chào. Tôi vừa hỏi bạn về một câu hỏi khác về mẫu này, Đây có phải là mẫu để dừng một luồng thông qua chờ xử lý không? (thay vì sử dụng hủy bỏ/ngắt)? –