Почему потоки накапливаются и не уничтожаются?



@sheich

Всем привет!
Столкнулись с такой проблемой: по мере работы .net 6.0 сервис, запущенный как Windows-служба, отъедает на машине все больше и больше потоков (см. Task Manager, колонка Threads) и не убивает их. Web API приложения обслуживает много несложных запросов. Вроде бы ничего некорректного в коде нет: много где внутренние сервисы вызываются через DI, using, применяются финализаторы, сборка мусора и т.п. Но периодически кол-во потоков начинает зашкаливать и вообще непонятно, куда смотреть.
Показатель Process.GetCurrentProcess().Threads.Count действительно очень большой.
Методы типа ThreadPool.SetMaxThreads() ничего не дают ((
В какую сторону смотреть?
Help!


Решения вопроса 2



@Griboks Куратор тега C#

Возможно, у вас не отрабатывает сборка (если отбросить ошибки в коде). Существует редкая ошибка утечки памяти, когда контекст переменной != контекст сборки мусора. Попробуйте избавиться от создания объектов внутри циклов и условий, а перенести всё это в отдельные функции.


Ответы на вопрос 2



@AshBlade

Смотреть в сторону разницы: Process.GetCurrentProcess().Threads.Count и ThreadPool.ThreadCount
Скорее всего какой-то сервис создает множество потоков (ручных) и держит ссылки на них, т.к. поток это объект ядра и он должен быть уничтожен когда на него перестают ссылаться, либо это просто поток, который не завершатся (while (true) какой-нибудь)



@mindtester Куратор тега Windows

любой прототип процесса можно дебажить как консоль (или множество)..
отладчик в руки!

ps а так то утечка… вопрос чего? ;))

pps отладочные записи в лог файлы, или в журнал.. ну это уже для процесса.
для консолей — консоль и сила в отладке ))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *