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?
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
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
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