문제

성공적인 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 스레드에서 호출되며 풀에 무료 스레드가 없으면 절대 호출되지 않습니다. 몇 가지 해결책이 있습니다.

  1. 페이지를 비동기로 만드십시오. ? 어떻게.
  2. 변경 수영장의 최대 실.

어쨌든 풀 크기를 늘리면 너무 많은 도움이되지 않습니다. Resource (Stream) 누출에 대한 코드를 검사하고 request.abort ()를 호출 할뿐만 아니라 응답을 닫아야합니다. 콜백에서 적절한 endxxx 메소드를 사용하는 것보다 확인하십시오.

나는 nazdrave :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top