2009-09-11 26 views

Trả lời

9

Không - ít nhất, không sạch. (Tôi không bao gồm Thread.Abort là "sạch".) Những gì bạn cần làm là có cơ chế để thông báo cho đại biểu rằng bạn đang đang cố gắng để hủy nó. Sau đó, người được ủy quyền của bạn sẽ cần phải kiểm tra cờ hủy đó và phản ứng tương ứng.

Tiện ích mở rộng song song đã hủy được tích hợp sẵn trên toàn bộ địa điểm (và trong mã thông báo hủy cụ thể chỉ cho phép các đoạn mã thích hợp để hủy tác vụ). Tất cả vẫn là hợp tác, theo như tôi biết. Buộc hủy sẽ luôn luôn chạy nguy cơ trạng thái hỏng.

1

Như Jon đã nêu, bạn không thể nói một chuỗi: "hãy ngừng ngay bây giờ" và mong đợi chủ đề tuân theo. Thread.Abort sẽ không nói với nó để dừng lại, sẽ chỉ đơn giản là "rút phích cắm" nó. :)

Những gì tôi đã làm trong quá khứ đã thêm một chuỗi "if (wehavetostop)" trong mã của chuỗi và nếu người dùng nhấn "hủy", tôi đặt wehavetostop == true.

Nó không quá thanh lịch và trong một số trường hợp, có thể "khó" đặt kiểm tra "nếu", đặc biệt nếu chuỗi của bạn chạy một thao tác "dài" mà bạn không thể chia.

Nếu bạn đang cố gắng thiết lập kết nối mạng (và phải mất thời gian) và bạn thực sự nghĩ rằng việc chấm dứt chuỗi "bất thường" sẽ không gây ra bất kỳ trạng thái hỏng nào, bạn có thể sử dụng nó, nhưng hãy nhớ rằng bạn không thể tin tưởng trạng thái của những thứ liên quan đến chủ đề đó.

5

Bạn có thể sử dụng System.ComponentModel.BackgroundWorker. Nó hỗ trợ hủy bỏ để bạn không phải viết mã boilerplate. Mã máy khách chỉ đơn giản có thể gọi phương thức CancelAsyn và bạn có thể kiểm tra tài sản CancellationPending trong mã của bạn khi nào và ở đâu hợp lý để xác định xem khách hàng đã hủy hoạt động và bảo lãnh chưa.

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