Максимальное количество streamов в приложении .NET?

Какое максимальное количество streamов вы можете создать в приложении C #? И что произойдет, когда вы достигнете этого предела? Исключено ли какое-то исключение?

Не существует неотъемлемого предела. Максимальное количество streamов определяется количеством доступных физических ресурсов. См. Эту статью Раймонда Чена для уточнения.

Если вам нужно спросить, что такое максимальное количество streamов, вы, вероятно, делаете что-то неправильно.

[ Обновление : Просто из интереса: .NET Thread Пул по умолчанию числа streamов:

  • 1023 в Framework 4.0 (32-разрядная среда)
  • 32768 в Framework 4.0 (64-разрядная среда)
  • 250 на kernel ​​в Framework 3.5
  • 25 на kernel ​​в Framework 2.0

(Эти номера могут различаться в зависимости от оборудования и ОС)]

Митч прав. Это зависит от ресурсов (памяти).

Хотя статья Раймонда посвящена streamам Windows, а не streamам C #, логика применяет то же самое (streamи C # сопоставляются с streamами Windows).

Однако, поскольку мы находимся на C #, если мы хотим быть полностью точными, нам нужно различать streamи «начальный» и «не запущенный». Только начатые streamи фактически резервируют пространство стека (как можно было ожидать). Не запущенные streamи выделяют информацию, требуемую объектом streamа (вы можете использовать отражатель, если заинтересованы в действительных членах).

Вы можете проверить его сами, сравните:

static void DummyCall() { Thread.Sleep(1000000000); } static void Main(string[] args) { int count = 0; var threadList = new List(); try { while (true) { Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); newThread.Start(); threadList.Add(newThread); count++; } } catch (Exception ex) { } } 

с:

  static void DummyCall() { Thread.Sleep(1000000000); } static void Main(string[] args) { int count = 0; var threadList = new List(); try { while (true) { Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); threadList.Add(newThread); count++; } } catch (Exception ex) { } } 

Поместите контрольную точку в исключение (вне памяти, конечно) в VS, чтобы увидеть значение счетчика. Разумеется, существует очень значительная разница.

я сделал тест на 64-битной системе с консолью c #, исключение – это тип из памяти, используя streamи 2949.

Я понимаю, что мы должны использовать пул streamов, который я делаю, но этот ответ отвечает на главный вопрос;)

Вы должны использовать пул streamов (или async delgates, которые, в свою очередь, используют пул streamов), чтобы система могла решить, сколько streamов должно выполняться.

Джефф Рихтер в CLR через C #:

«С версией 2.0 CLR максимальное число рабочих streamов по умолчанию составляет 25 на процессор в машине, а максимальное количество streamов ввода-вывода по умолчанию равно 1000. Предел 1000 фактически не ограничен».

Обратите внимание, что это основано на .NET 2.0. Возможно, это изменилось в .NET 3.5.

[Edit] Как отметил @Mitch, это относится к CLR ThreadPool. Если вы создаете streamи, напрямую смотрите комментарии @Mitch и другие.

  • Разница между указателем и ссылкой как параметр streamа
  • Atomic UPDATE .. SELECT в Postgres
  • Как я должен тестировать многопоточный код?
  • Обработчики, MessageQueue, Looper, все ли они работают в streamе пользовательского интерфейса?
  • Считается ли приемлемым не вызывать Dispose () в объекте задачи TPL?
  • C ++ эквивалентно Java BlockingQueue
  • вызывающий thread.start () внутри своего собственного конструктора
  • Как обновить текстовое поле в графическом интерфейсе из другого streamа
  • Выполняются ли одновременно два синхронизированных метода
  • Конфигурация нитей на основе №. процессорных ядер
  • Redis + ActionController :: Живые streamи не умирают
  • Interesting Posts

    Можно ли запустить несколько версий Google Chrome на одном компьютере? (Mac или Windows)

    Как объединить 2 или более запросов в представлении Django?

    Как изменить цвет линии разделителя Android ListView?

    Инициализация свойства списка без «нового списка» вызывает исключение NullReferenceException

    jQuery Перетаскивание с использованием живых событий

    GET против POST в AJAX?

    Как проверить, включено ли хотя бы одно из нескольких полей ввода?

    Разрешение на чтение и запись для раздела FAT32 в Ubuntu

    Как обращаться с произвольно большими целыми числами

    Async ожидает файлового дескриптора, используя Boost Asio

    У меня везде есть ОЗУ. Как я могу определить его?

    Интернет через беспроводную точку доступа, интранет через проводную сеть – могу ли я использовать оба одновременно?

    Android: Использование findViewById () со строкой / в цикле

    Доступ к элементам управления пользовательским интерфейсом в Task.Run с помощью async / wait на WinForms

    Как сбросить объем волны и общий объем до максимального?

    Давайте будем гением компьютера.