Какое максимальное количество потоков вы можете создать в приложении C #? И что происходит, когда вы достигаете этого предела? Это исключение какого-то рода?
c#
.net
multithreading
Джон Сондерс
источник
источник
Ответы:
Там нет врожденного ограничения. Максимальное количество потоков определяется количеством доступных физических ресурсов. Смотрите эту статью Раймонда Чена для деталей.
Если вам нужно спросить, каково максимальное количество потоков, вы, вероятно, делаете что-то не так.
[ Обновление : Просто из интереса: .NET Thread Pool по умолчанию номера потоков:
(Эти цифры могут отличаться в зависимости от оборудования и ОС)]
источник
Митч прав. Это зависит от ресурсов (памяти).
Хотя статья Рэймонда посвящена потокам Windows, а не потокам C #, логика применяется одинаково (потоки C # отображаются на потоки Windows).
Однако, поскольку мы находимся в C #, если мы хотим быть абсолютно точными, нам нужно различать «запущенные» и «незапущенные» потоки. Только запущенные потоки фактически резервируют пространство стека (как мы могли ожидать). Незапущенные потоки распределяют только информацию, требуемую объектом потока (вы можете использовать отражатель, если заинтересованы в реальных членах).
Вы можете проверить это сами, сравните:
с участием:
Поместите точку останова в исключение (вне памяти, конечно) в VS, чтобы увидеть значение счетчика. Конечно, есть очень существенная разница.
источник
Я провел тест на 64-битной системе с консолью c #, исключение составляет тип нехватки памяти, использующий потоки 2949.
Я понимаю, что мы должны использовать пул потоков, что я и делаю, но этот ответ является ответом на главный вопрос;)
источник
Вы должны использовать пул потоков (или асинхронные delgates, которые, в свою очередь, используют пул потоков), чтобы система могла решить, сколько потоков должно выполняться.
источник
Джефф Рихтер в CLR через C #:
«В версии 2.0 CLR максимальное число рабочих потоков по умолчанию равно 25 для каждого процессора в машине, а максимальное число потоков ввода-вывода по умолчанию равно 1000. Ограничение 1000 фактически не ограничено».
Обратите внимание, что это основано на .NET 2.0. Это могло измениться в .NET 3.5.
[Редактировать] Как заметил @Mitch, это относится к CLR ThreadPool. Если вы создаете темы, смотрите комментарии @Mitch и другие.
источник
Вы можете проверить это, используя этот код:
Остерегайтесь 32-битного и 64-битного режима применения.
источник
Я бы порекомендовал запустить метод ThreadPool.GetMaxThreads в отладке
Документы и примеры: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8
источник