Как создавать неопределенные фоновые потоки в цикле в C # .NET - PullRequest
1 голос
/ 23 марта 2012

У меня есть цикл, который должен создавать неопределенное и неопределенное количество фоновых потоков.Затем потоки просто запустятся до завершения, но некоторые, возможно, придется отменить.

Первоначально я планировал сделать это, объявив один backgroundWorker, добавив его в список, а затем добавив BackgroundWorker, чтобы начать процесс снова.Однако, поскольку метод List.Add выполняется по ссылке на переданный объект, я думаю, что при создании нового исходного BackgroundWorker поток, на который ссылается List, будет потерян (или хуже).

Вторая мысльпросто присваивая мое новое значение элементу в массиве (array [i] = new BackgroundWorker ()), но это не поддается неопределенному количеству потоков.управлять этими отдельными потоками?Заранее спасибо.

1 Ответ

6 голосов
/ 23 марта 2012

Два комментария - один микро, один макрос.

Во-первых, кажется, что TPL будет соответствовать вашим заявленным целям.Используя Task.Factory.StartNew(), вы сможете создавать произвольное количество операций, которые будут выполняться в фоновых потоках.Кроме того, используя перегрузки, которые принимают CancellationToken, вы отменяете операции настолько хорошо, насколько вы можете пожелать.Обратите внимание, что задача не эквивалентна потоку - по умолчанию задачи запускаются в потоках ThreadPool (как, впрочем, и фоновые рабочие).Вполне возможно, что ваши задачи окажутся в очереди в ожидании доступности пула.

Во-вторых, более крупный комментарий.

Вы утверждаете, что у вас будет неопределенное и неопределенное числорабочих предметов.То, что вы создадите поток для каждого элемента, делает меня немного раздражительным - потоки не дешевы, и если у вас есть большое количество рабочих элементов, вы можете морить голодом свой процесс, наивно запуская новые темы.

Можете ли вы уточнитьна что нужно делать с этими темами?Я не знаю, что представляет собой рабочий элемент для вашего проекта, но вполне возможно, что настройка производителя / потребителя с фиксированным числом потоков будет соответствовать вашим потребностям распараллеливания..NET 4.0 облегчает работу с классами System.Collections.Concurrent.

РЕДАКТИРОВАТЬ в ответ на комментарий

Случай TCP-соединений очень близок к тому, о чем я думало том, когда я написал второй комментарий выше.В этом случае вы рассматриваете потенциально бесконечное потребление ограниченного ресурса ОС, а именно открытых сокетов.Я надеюсь, что вы будете расследовать неблокирующие операции ввода-вывода. Эта страница MSDN документирует асинхронное чтение из сокетов, а эта говорит о более крупной модели асинхронного программирования в .NET.

Для масштабируемого обслуживания TCP, хорошее обсуждение ужесуществует на SO: читайте в свое удовольствие .

...