2012-05-08 2 views
4

HttpWebRequest.BeginGetResponse는 HttpWebRequest (Timeout 또는 ReadWriteTimeout)의 모든 Timeout 속성을 존중하지 않습니다.HttpWebRequest.BeginGetResponse를 사용하는 타임 아웃에 대한 최선의 접근 방법

같은 결과를 얻으려면 몇 가지 접근법을 읽었지 만, 최선의 방법인지, 몇 가지 호출에 사용해야하는지 또는 루프 내에서 확장 할 수 있는지 (웹 크롤러를 수행하고 있는지) .

중요한 것은 처음에는 내 코드가 비동기가 아니며, 내 메서드가 CancellationToken을 받아 들여야하기 때문에 비동기가 필요하다는 것입니다.

내 관심사는 WaitHandles 및 ThreadPool.RegisterWaitForSingleObject에 관한 것입니다. 가까운 장래에 문제가 발생할 수있는 일일 코드가 아니라면 알지 못합니다.

private static void HandleCancellation(HttpWebRequest request, IAsyncResult getResponseResult, CancellationToken cancellationToken) 
{ 
    using (WaitHandle requestHandle = getResponseResult.AsyncWaitHandle) 
    { 
     ThreadPool.RegisterWaitForSingleObject(requestHandle, TimeoutCallback, request, request.Timeout, true); 

     //If request finish or cancellation is called 
     WaitHandle.WaitAny(new[] {requestHandle, cancellationToken.WaitHandle}); 
    } 

    //If cancellation was called 
    if (cancellationToken.IsCancellationRequested) 
    { 
     request.Abort(); 
     cancellationToken.ThrowIfCancellationRequested(); 
    } 
} 

호출 (다시, 그것은 밤은 비동기)

IAsyncResult getResponseResult = request.BeginGetResponse(null, null); 

HandleCancellation(request, getResponseResult, cancellationToken); 

return (HttpWebResponse)request.EndGetResponse(getResponseResult); 

참조 : Better approach in management of multiple WebRequestBeginGetResponse에 대한 MSDN 문서는 시간 제한을 처리하는 방법의 아주 좋은 예제가

+0

문제가 발생하면 시간 초과를 기다리는 리소스를 사용하는 비동기 요청이 많이 발생합니까? 왜 그냥 시간 초과하지 마십시오. –

+0

TPL을 사용하지 않으셨습니까? – abatishchev

+0

어디서 TPL을 사용해야합니까? 작업을 사용하여이 메서드를 호출하지만 메서드 내에서는 호출하지 않습니다. –

답변

3

. 내 웹 크롤러에서 잘 작동했습니다.

+0

비슷한 일을하고 있지만 ManualResetEvent 대신 WaitHandle.WaitAny를 사용하고 있습니다. 그것은 더 깨끗한 코드를 허용한다. –