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 문서는 시간 제한을 처리하는 방법의 아주 좋은 예제가
문제가 발생하면 시간 초과를 기다리는 리소스를 사용하는 비동기 요청이 많이 발생합니까? 왜 그냥 시간 초과하지 마십시오. –
TPL을 사용하지 않으셨습니까? – abatishchev
어디서 TPL을 사용해야합니까? 작업을 사용하여이 메서드를 호출하지만 메서드 내에서는 호출하지 않습니다. –