Создание пула потоков в c # - PullRequest
       15

Создание пула потоков в c #

1 голос
/ 12 октября 2010

У меня есть 300 потоков, которые выполняются один за другим. Я использую соединение, поэтому его по одному. Я хочу выполнить N потоков одновременно.

Может кто-нибудь направить меня по ссылке на создание пула потоков в C # (с N потоков). Моя ситуация в то время N потоков будут выполняться, остальные потоки будут ждать. Когда один поток завершает выполнение, один ожидающий поток вступит в выполнение.

Любой фрагмент кода приветствуется. Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 12 октября 2010

Присоединение не диктует, что потоки выполняются последовательно - оно просто заставляет текущий поток ждать завершения указанного потока, прежде чем продолжить.

Таким образом, если вы запустите 300 потоков, а затем соедините их все, 300 потоков будут работать параллельно, и объединение потоков завершится после завершения 300 потоков.

const int COUNT = 300;

// create and start the threads
var threads = new Thread[COUNT];
for (int index = 0; index < COUNT; index += 1)
{
    threads[index] = new Thread(...);
    threads[index].Start();
}

// now they're running, join them all
for (int index = 0; index < COUNT; index += 1)
{
    threads[index].Join();
}

// we're done

Важной частью является то, что вы запускаете их все до начала объединения, в противном случае вы будете ждать окончания каждого потока, прежде чем начинать следующий, поэтому тогда они действительно будут последовательными. Я думаю, это то, что вы можете делать?

2 голосов
/ 12 октября 2010

Я думаю, что вы, вероятно, ищете ThreadPool.QueueUserWorkItem . Использование пула потоков уменьшает большие накладные расходы на создание и уничтожение потоков. Вы можете настроить потоки (ссылка в моих комментариях) на основе доступного оборудования или позволить системе наилучшим образом управлять минимальными / максимальными одновременными потоками. Если это веб-приложение, вы можете установить его в своем файле web.config, чтобы установить номер потока "N":

   <system.web>
        <processModel minWorkerThreads="50"/>
   </system.web>

Если вы используете .NET 4.0, вы также можете использовать «Parallel.ForEach», который будет автоматически планировать каждую итерацию цикла для нескольких потоков в пуле потоков. (ссылка в моих комментариях)

2 голосов
/ 12 октября 2010

Если большинство ваших потоков ждут, вы должны взглянуть на класс System.Threading.ThreadPool. Это может просто сделать именно то, что вы хотите. И это эффективно.

...