Номер активной темы в пуле потоков - PullRequest
7 голосов
/ 08 марта 2011

Когда я пишу приведенный ниже код, почему я получаю доступный номер потока, например 1022, 1020. Мне нужно получить максимум 25 потоков, поскольку я использую пул потоков.

Я предполагаю, что номер выходного потока - это доступные потоки в системе.Мне нужно получить доступный номер потока в моем пуле потоков в приложении win form.

private void Foo()
{
    int intAvailableThreads, intAvailableIoAsynThreds;

    // ask the number of avaialbe threads on the pool,
    //we really only care about the first parameter.
    ThreadPool.GetAvailableThreads(out intAvailableThreads,
        out intAvailableIoAsynThreds);

    // build a message to log
    string strMessage =
        String.Format(@"Is Thread Pool: {1},
            Thread Id: {2} Free Threads {3}",
            Thread.CurrentThread.IsThreadPoolThread.ToString(),
            Thread.CurrentThread.GetHashCode(),
            intAvailableThreads);

    // check if the thread is on the thread pool.
    Trace.WriteLine(strMessage);

    // create a delay...
    Thread.Sleep(30000);

    return;
}

Большое спасибо ..

(Примечание: я получил код от http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx) Хорошая статья !!

Ответы [ 4 ]

9 голосов
/ 08 марта 2011

Мне нужно получить максимум 25 потоков, поскольку я использую пул потоков.

Максимальное количество потоков в пуле потоков на ядро ​​со временем сильно изменилось.Это больше не 25 на ядро, что, как я подозреваю, является тем, что вы ожидали.

Например, при запуске этого на моем четырехъядерном ноутбуке с многопоточным доступом с .NET 4 я получаю максимум 32767 рабочих потоков и 1000 операций ввода-вывода.Потоки порта завершения:

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        int worker; 
        int ioCompletion;
        ThreadPool.GetMaxThreads(out worker, out ioCompletion);
        Console.WriteLine("{0} / {1}", worker, ioCompletion);
    }    
}

В .NET 3.5 я получаю 2000 рабочих потоков и все еще 1000 потоков порта завершения ввода-вывода.

Хотя это не число потоков на самом деле в пуле потоков- это максимальное число, которое пул потоков позволяет самому создавать со временем.

5 голосов
/ 08 марта 2011

Используйте ThreadPool.GetMaxThreads, чтобы получить то, что вы хотите.

Эта статья помогает объяснить все, что вам нужно знать о ThreadPool.

1 голос
/ 15 мая 2013

Я установил оба на 10001, используя ThreadPool.SetMaxThread.После этого всякий раз, когда я запускаю вашу программу, она показывает максимальный поток 10001, она сохраняется.Я не перезапустил свою систему Core i 5.

После этого я установил оба значения на 10000000, и он показывает следующее максимальное число потоков

рабочий: 32767 ioCompletion: 32767

Итак, на моем Windows 7 Intel Core i5это максимальная вместимость.

0 голосов
/ 25 мая 2012
int available;
int maxLimit;
System.Threading.ThreadPool.GetAvailableThreads(out available, out maxLimit);
...