HttpWebRequest.BeginGetResponse не учитывает свойства времени ожидания из HttpWebRequest (Timeout или ReadWriteTimeout).
Я прочитал некоторые подходы, чтобы получить те же результаты, но я не знаю, лучший ли это способ сделать это, и следует ли мне использовать для нескольких вызовов или я могу масштабировать его внутри циклов (я делаю веб-краулер).
Важно то, что изначально мой код не асинхронный, мне просто нужен асинхронный, потому что мой метод должен принимать 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);