2012-06-07 44 views
5

Dựa trên số lượng câu hỏi, bài đăng trên diễn đàn, v.v, có vẻ như việc triển khai TcpClient/NetworkStream trong BCL thiếu hỗ trợ phong nha để hủy thao tác IO. Với việc bổ sung các phương thức Async trong .NET 4.5, việc thiếu sự hủy bỏ (hoặc hỗ trợ hết thời gian chờ) làm cho mọi thứ trở nên khó chịu hơn vì nó trở nên phức tạp hơn (không thể thực hiện được) để hủy bỏ một nhiệm vụ từ chối theo dõi CancellationToken của nó trong khi thực hiện IO ..NET TcpClient/NetworkStream thực hiện hỗ trợ các hoạt động không đồng bộ và tôn trọng timeouts

Tôi đã thấy nhiều triển khai quay lên các chuỗi bổ sung để theo dõi hoạt động mạng và đóng luồng cơ bản nếu mọi thứ có vẻ không ổn. Điều này cảm thấy rất bẩn trong một thế giới mà chúng tôi đang cố gắng bảo tồn các tài nguyên này bằng cách sử dụng các hoạt động không đồng bộ.

Bất cứ ai có thể chỉ cho tôi theo hướng dẫn để xử lý việc hủy bỏ hiệu quả/định thời các hoạt động IO của mạng hay hướng tới triển khai mạnh mẽ của bên thứ ba thực sự hoạt động không?

Trả lời

4

Hủy IO không phải là tầm thường. Bắt đầu với Vista, chúng tôi có khả năng CancelIO, nhưng đó là một điều khá mới và trình điều khiển cần phải hỗ trợ nó.

Thực tế, tốt nhất bạn có thể làm là đóng socket để hủy mọi thứ. Ngoài ra, bạn có thể triển khai hàm bao bọc xung quanh một tác vụ cung cấp hoàn thành ngay lập tức khi thiết lập CancellationToken. Thao tác IO vẫn sẽ tiếp tục nhưng kết quả của nó sẽ bị loại bỏ.

Đây là một cuộc thảo luận kỹ lưỡng về vấn đề này: http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

Tôi nghĩ CancelIo/CancelIoEx được chức năng cấp hệ điều hành, chứ không phải là những người dựa vào trình điều khiển để thực hiện/hỗ trợ họ? – Andrew

+0

Chúng là các API Win32 gọi tới các kernes gọi đến trình điều khiển. Nếu bạn hủy đọc lớn, trình điều khiển cần hợp tác bằng cách yêu cầu đĩa dừng lại. CancelIO có hiệu ứng vật lý. – usr

+2

Cảm ơn bạn đã đẩy tôi theo hướng này. Tôi đã tìm thấy CancelIo/CancelIoEx là cấp hệ điều hành và không yêu cầu hỗ trợ cấp trình điều khiển. Đã thực hiện một chút nghiên cứu thêm về điều này, tôi đã xem qua bài này (không có ý tưởng làm thế nào tôi bị mất nó trước) mà thảo luận về những thách thức của việc hủy bỏ async IO. Có vẻ như tập tin dựa trên IO là dòng để có được một đại tu nhưng mạng không phải là. http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew