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, вы можете отслеживать запросы, чтобы вы знали, что программа все еще работает или нет.

Не стесняйтесь, дайте мне знать, если вы можетеТиражировать проблему.

Ответы на вопрос(3)

Ваш ответ на вопрос