У меня есть следующий тестовый код. Я всегда получаю ошибку "Задача была отменена" после цикла 316934 или 361992 раз.
Если я не ошибаюсь, есть две возможные причины, по которым задача была отменена. a) 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 минуты. Если у вас есть скрипач, вы можете отслеживать запросы, чтобы вы знали, что программа все еще работает или нет.
Не стесняйтесь, дайте мне знать, если вы не можете воспроизвести проблему.