Я строю довольно сложную параллельную систему и наткнулся на странную проблему. Я постараюсь быть простым.
- У меня есть консольное приложение с одним экземпляром на .net core 2.1
- У меня есть один экземпляр HttpClient
- Я установил следующие параметры:
System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue;
System.Net.ServicePointManager.ReusePort = true; HttpClient.DefaultRequestHeaders.ConnectionClose = true;
HttpClient.SetBearerToken (SOME_TOKEN);
- У меня есть поток (A) , который постоянно создает до 30 новых параллельных потоков с одним запросом HTTP GET внутри, используя ThreadPool / new Thread () (пробовал оба) и помещает результаты в переменную ConcurrentQueue.
- У меня есть другой поток (B) , который читает из очереди и постоянно создает до 30 новых параллельных потоков с одним запросом HTTP POST внутри.
Проблема в том, что я получаю следующий рабочий процесс:
- Поток A работает хорошо, отправляя очередь с результатами. Все темы работают нормально.
- Поток B начинает создавать дочерние потоки для POST после запуска потока A.
- Поток A завершает свою работу, все потоки завершаются. На этом этапе все потоки, созданные потоком B, висят на клиенте await. Метод PostAsync () .
- Приложение зависает примерно на 10 секунд.
- Журнал VS показывает несколько Поток 0x35e0 завершился с кодом 0 (0x0). Сообщения о том, что ранее использовавшиеся потоки освобождаются. Почему так долго?!
- Приложение зависает на 20 секунд
- Первые потоки, созданные потоком B, начинают отказывать, а все остальные потоки B начинают нормально работать.
Пробовал:
Снижение количества одновременных потоков до 5-10 за раз решает проблему, но полностью разрушает параллельную производительность.
Я вижу количество потоков в журнале, и переполнения нет, максимум 30 потоков одновременно для A и B (приблизительно 60 приблизительно)
Попытка понизить System.Net.ServicePointManager.DefaultConnectionLimit , но это не поможет.
Похоже, что-то блокирует POST-запросы, а затем они просто спешат снова нормально. Пожалуйста, совет по этому вопросу. Спасибо.
PS: я работаю с Flickr запросами. Могут ли быть некоторые из их ограничений доступа? Зависание POST выглядит странно в любом случае, просто зависает без единого прохода.