.NET CANCEL Stream BeginRead
문제
성공적인 HTTPWebRequest 후 비동기식 읽기 작업을 취소/종료하는 방법을 찾을 수 없었습니다. TimeOut을 설정할 방법이 없습니다. ResidPool.registerWaitForsingleObject도 작동하지 않습니다. HTTPWebRequest/Reponse는 이에 대한 액세스를 제공하지 않기 때문에 기본 소켓을 닫는 것도 옵션이 아닙니다.
편집하다:
슬프게도 Sunny가 제안한이 접근법은 httpwebrequest.begingetresponse에만 효과가 있습니다. getReponseStream () 이후에 얻는 스트림의 경우 어떤 이유로 registerwaitforsingleobject가 작동하지 않습니다 - 콜백은 호출되지 않습니다.
상황은 다음과 같습니다. httpgetRequest를 사용하는 응용 프로그램이 있습니다. Async httpwebrequest의 기본 MSDN 예제를 사용하여 빌드됩니다. 응답을 얻는 것은 매력처럼 작동합니다. 그러나 드문 경우에는 내 httpwebrequest가 소켓을 닫는 것을 잊기 위해 연결하고 있습니다. 그래서 나는 Beginread에서 무한한 독서에 매달려 있습니다.
드문 경우에 다른 서버는 잊어 버립니다
해결책
registerwaitforsingleobject가 아닌 이유는 무엇입니까? 타임 아웃에 사용할 수 있으며 핸들러에서 request.abort ()를 호출 할 수 있습니다.
여기에 있습니다 예시. BTW, 나는 과거 에이 기사를 찾기 전에 시뮬레이션 접근법을 사용했으며, 그 매력처럼 작동했습니다.
참고 : 작업의 실제 끝은 다음 스트림에서 발생합니다 (요청/응답 만 Async) 또는 stream.endread (판독 값도 비동기 인 경우). EndXXXX 핸들러에있는 예외를 여전히 캡처해야합니다.
편집 : RegisterwaitForsingleObject가 호출되지 않으면 다른 문제가있을 수 있습니다. 아마도 무료 스레드가 충분하지 않은 스레드 풀일 것입니다. RegisterWaitForsingle 객체의 콜백은 ThreadPool 스레드에서 호출되며 풀에 무료 스레드가 없으면 절대 호출되지 않습니다. 몇 가지 해결책이 있습니다.
어쨌든 풀 크기를 늘리면 너무 많은 도움이되지 않습니다. Resource (Stream) 누출에 대한 코드를 검사하고 request.abort ()를 호출 할뿐만 아니라 응답을 닫아야합니다. 콜백에서 적절한 endxxx 메소드를 사용하는 것보다 확인하십시오.
나는 nazdrave :)