У меня есть следующий тестовый код. Я всегда получаю ошибку «Задача была отменена» после цикла 316934 или 361992 раз.HttpClient - задача была отменена - Как получить точное сообщение об ошибке?
Если я не ошибаюсь, возможны две причины, по которым задача была отменена.) HttpClient получил тайм-аут или b) слишком много задач в очереди, а некоторые задачи получили тайм-аут.
Я не смог найти документацию об ограничении в очередности задач. И я попытался создать более 500 тыс. Задач и без тайм-аута. Думаю, причина «b» может быть неправильной.
Q1. Есть ли еще одна причина, по которой я пропустил?
Q2. Если это потому, что тайм-аут HttpClient, как я могу получить точное сообщение исключения вместо исключения «TaskCancellation».
Q3. Какой был бы лучший способ исправить это? Должен ли я ввести дроссель?
Спасибо!
var _httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
int[] intArray = Enumerable.Range(0, 600000).ToArray();
var results = intArray
.Select(async t => {
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com")) {
log.Info(t);
try {
var response = await _httpClient.SendAsync(requestMessage);
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent;
}
catch (Exception ex) {
log.ErrorException(string.Format("SoeHtike {0}", Task.CurrentId), ex);
}
return null;
}
});
Task.WaitAll(results.ToArray());
Console.ReadLine();
Вот этот шаг, чтобы воспроизвести проблему.
Создание проекта консоли в VS 2012.
Пожалуйста, скопируйте и вставьте свой код в Main.
Поместите контрольную точку на этой линии "log.ErrorException (String.Format (" SoeHtike {0} " Task.CurrentId), ех);"
Запуск программы в режиме отладки. Подождите несколько минут. (может быть, 5 минут?) Я только что проверил свой код, и я получил исключение через 3 минуты. Если у вас есть скрипач, вы можете отслеживать запросы, чтобы вы знали, что программа все еще работает или нет.
Не стесняйтесь, дайте мне знать, если вы не можете воспроизвести проблему.
Что вы делаете, так это то, что страница 600.000 эффективно DOS Attack, и вы не должны этого делать. –
Привет, я понимаю. Но есть некоторые сайты, которые могут обрабатывать огромные запросы. И мне очень нравится знать, почему я получил «Задача была отменена» без фактического сообщения об ошибке. –
и плюс, я не думаю, что это сайт, который блокирует мой запрос –