it-swarm.com.ru

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

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

123
creedence.myopenid.com

Там нет врожденного ограничения. Максимальное количество потоков определяется количеством доступных физических ресурсов. Смотрите это статья Раймонда Чена для уточнения.

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

[ Обновление : просто не представляет интереса: номера потоков по умолчанию .NET Thread Pool:

  • 1023 в Framework 4.0 (32-разрядная среда)
  • 32767 в Framework 4.0 (64-битная среда)
  • 250 на ядро ​​в Framework 3.5
  • 25 на ядро ​​в Framework 2.0

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

134
Mitch Wheat

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

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

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

Вы действительно можете проверить это сами, сравните:

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        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<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

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

25
antonio

я провел тест на 64-битной системе с консолью c #, исключение составляет тип нехватки памяти, использующий потоки 2949.

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

8
MadApples

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

6
Ian Boyd

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

"В версии 2.0 CLR максимальное число рабочих потоков по умолчанию равно 25 для каждого процессора в машине, а максимальное число потоков ввода-вывода по умолчанию равно 1000. Ограничение 1000 фактически не ограничено".

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

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

4
Ash