HttpClient - задача была отменена - Как получить точное сообщение об ошибке?
У меня есть следующий тестовый код. Я всегда получаюЗадача была отменена ошибка после зацикливания 316934 или 361992 раза.
Если я не ошибаюсь, есть две возможные причины, по которым задача была отменена: а) HttpClient получил тайм-аут или б) слишком много задач в очереди и некоторые задачи получили тайм-аут.
Я не могнайти документацию об ограничении в очереди задач. И я попытался создать более 500 тыс. Заданий без тайм-аута. Я думаю, причина "б" может быть не прав.
Q1. Есть ли какая-то другая причина, которую я пропустил?
Q2. Если оно's потому что таймаут 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), ex); "
Запустите программу в режиме отладки. Подождите несколько минут. (может быть 5 минут?) Я только что проверил свой код, и через 3 минуты я получил исключение. Если у вас есть Fiddler, вы можете отслеживать запросы, чтобы вы знали, что программа все еще работает или нет.
Не стесняйтесь, дайте мне знать, если вы можетеТиражировать проблему.