Моя цель - получить ответ от 6000 URL-адресов в кратчайшие сроки. Он работал очень хорошо (12 секунд для 5200 адресов локальной сети), пока не начала происходить некоторая задержка.
Мой код использует до 20 одновременных HttpWebRequest.BeginGetResponse с ThreadPool.RegisterWaitForSingleObject
для обработки тайм-аута.
Однако некоторые (до 4 на 5000) запросов никогда не обращаются к функции TimeoutCallback со вторым параметром (timedOut) true, и они тратят 5 минут моего драгоценного времени, пока не достигают функции BeginGetResponseCallback и затем вызывают исключение WebException. В исключениях написано что-то вроде «операция достигла предела времени», но поскольку сообщение об исключении написано на португальском (мой родной язык), я не смог найти его в Google.
Интересно, могу ли я, например, сократить этот срок до 20 секунд? Кто-нибудь знает как? Я уже пробовал:
<system.web>
<httpRuntime executionTimeout="20"/>
</system.web>
Но поскольку я запускаю его как консольное приложение, конфигурации ASP.NET не работают. И я тоже попробовал:
myHttpWebRequest.Timeout = 20*1000;
И
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), AsyncState, 20*1000, true);
Без успеха. Вы можете мне помочь?
Обновление
Я пытаюсь сказать, что есть 4 возможных результата для асинхронного HTTP-запроса:
- Никогда не достигать функции обратного вызова -> функция обратного вызова тайм-аута
- Достигает и успешно отвечает
- Достигает и вызывает исключение
- Задержка ровно на 5 минут, пока не появится веб-исключение "ограничение по времени" внутри функции обратного вызова
Четвертая возможность - это задержка моего заявления, и я не знаю, как сократить эту задержку
Обновление
Есть ли вероятность, что метод GetResponseStream
вместо GetResponse
вызывает таймаут?