2008-11-13 1 views
3

HttpWebRequest가 성공한 후 비동기 읽기 작업을 취소하거나 종료하는 방법을 찾지 못했습니다. 타임 아웃을 설정할 방법이 없으므로 ThreadPool.RegisterWaitForSingleObject도 작동하지 않습니다. 또한 HttpWebRequest/Reponse가 그것에 대한 액세스를 제공하지 않기 때문에 기본 소켓을 닫는 것도 옵션이 아닙니다..NET 취소 스트림 BeginRead

편집 : 써니 suggestet 만은 HttpWebRequest.BeginGetResponse 작동

안타깝게도이 방법. RegisterWaitForSingleObject가 작동하지 않는 이유로 GetResponseStream() 뒤에 오는 스트림의 경우 콜백이 호출되지 않습니다.

상황은 다음과 같습니다. HttpGetRequest를 사용하는 응용 프로그램이 있습니다. 비동기 httpwebrequest에 대한 기본 MSDN 예제를 사용하여 빌드됩니다. 반응을 얻는 것이 매력처럼 작동합니다. 하지만 드물게 내 httpwebrequest가 소켓을 닫는 것을 잊어 버리는 서버입니다. 그래서 저는 BeginRead에서 무한한 읽기에 매달 렸습니다. RegisterWaitForSingleObject하지 왜 일부 드문 경우에

다른 서버는

답변

1

를 잊어? 당신은 타임 아웃을 위해 그것을 사용할 수 있고, 당신은 request.Abort()를 호출 할 수있다.

여기에 example이 있습니다. Btw, 과거에이 기사를 찾기 전에 나는 simial 접근법을 사용했으며, 매력처럼 작동했습니다.

참고 : 작업의 실제 종료는 다음 Stream.Read (요청/응답이 비동기 임) 또는 Stream.EndRead (읽기가 비동기 인 경우)에서 발생합니다. 여전히 EndXXXX 핸들러에 던져진 예외를 캡처해야합니다.

EDIT : RegisterWaitForSingleObject가 호출되지 않으면 다른 문제가 발생합니다.이 문제는 대부분 프리 스레드가 충분하지 않은 ThreadPool입니다. RegisterWaitForSingle 객체의 콜백은 ThreadPool 스레드에서 호출되며 풀에 사용 가능한 스레드가없는 경우 호출되지 않습니다. 해결책은 다음과 같습니다.

  1. 페이지를 비동기로 설정하십시오. Why? How.
  2. max threads in the pool을 변경하십시오.

어쨌든 수영장 크기를 늘리면 도움이되지 않습니다. 리소스 (스트림) 누수에 대한 코드를 검사하고 request.Abort()를 호출 할뿐만 아니라 응답을 닫아야합니다. 콜백에서 올바른 EndXXX 메소드 등을 사용하십시오.

나스브레이브 :