2012-06-07 7 views
5

질문, 포럼 게시물 등의 수에 따라 BCL의 TcpClient/NetworkStream 구현에 IO 작업 취소에 대한 지원이 부족한 것처럼 보입니다. .NET 4.5에서 비동기 메서드를 추가하면 IO를 수행하는 동안 CancellationToken을 모니터링하는 것을 거부하는 작업을 취소하는 것이 훨씬 더 복잡해집니다 (불가능할 수도 있음). .비동기 작업을 지원하고 시간 초과를 지원하는 .NET TcpClient/NetworkStream 구현

네트워크 작업을 모니터링하고 상황이 잘못 될 경우 기본 스트림을 닫으려는 추가 스레드를 시작하는 많은 구현을 보아 왔습니다. 이것은 비동기 작업을 사용하여 이러한 리소스를 보존하려는 세계에서 매우 더럽습니다.

네트워크 IO 작업을 효율적으로 취소/시간 초과하거나 실제로 작동하는 견고한 타사 구현을 처리하는 것과 관련하여 누구나 지침의 방향을 제시 할 수 있습니까?

답변

4

IO 취소는 간단하지 않습니다. Vista를 시작으로 우리는 CancelIO 기능을 가지고 있지만 꽤 새로운 기능이며 드라이버는이를 지원해야합니다.

실질적으로 말하면, 최선을 다하면 소켓을 닫아서 모든 것을 취소 할 수 있습니다. 또는 CancellationToken이 설정되면 즉시 완료 할 수있는 태스크 주위에 래퍼 함수를 ​​구현할 수 있습니다. 입출력 작업은 계속되지만 결과는 무시됩니다. http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

내가 CancelIo/CancelIoEx 생각 것들을 구현하는 드라이버에 의존하기보다는 /을 지원, OS 수준의 기능을했다 :

여기에 문제에 대한 철저한 논의는 무엇입니까? – Andrew

+0

이들은 드라이버를 호출하는 kernes를 호출하는 Win32 API입니다. 큰 읽기를 취소하면 드라이버가 디스크를 멈추도록 협조해야합니다. CancelIO는 물리적 인 효과가 있습니다. – usr

+2

나를이 방향으로 밀어 주셔서 감사합니다. 나는 CancelIo/CancelIoEx가 OS 수준이고 드라이버 수준의 지원이 필요 없다고 생각했습니다. 이 문제에 대해 좀 더 연구를 해본 결과 비동기 IO를 취소하는 문제를 설명하는이 게시물 (이전에 내가 어떻게보고 싶었는지 전혀 모르는)을 발견했습니다. 파일 기반 IO는 정밀 검사를 받기 위해 선상에 있지만 네트워크는 그렇지 않습니다. http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew