Хорошая форма в запуске Parallel.ForEach в новой теме - PullRequest
2 голосов
/ 15 марта 2011

Я работаю над проектом службы Windows. Служба запускает двигатель. У движка есть один-много «опросчиков», каждый из которых я хочу запустить в своем собственном потоке, чтобы они выполняли «опрос» параллельно. Я использую Parallel.ForEach в методе Start () движка, чтобы получить опрос pollers, и это прекрасно работает. Однако я бы хотел, чтобы служба могла запустить двигатель, а затем заняться другими делами (например, сообщать о состоянии двигателя и его опросов в различных точках или чего-либо еще). Это лучший способ запустить двигатель без блокировки первичного потока:

    System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
worker.DoWork += new System.ComponentModel.DoWorkEventHandler((sender, e) => Parallel.ForEach(Pollers.Where(p => p.Active), p => p.StartPolling()));
worker.RunWorkerAsync();

Или у кого-нибудь есть идеи по поводу лучшего способа сделать это?

Ответы [ 2 ]

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

Я бы пошел с библиотекой задач .Net 4, намного более чистой, чем старая модель Thread

// Create a task and supply a user delegate by using a lambda expression.
var taskA = new Task(() =>Parallel.ForEach(Pollers.Where(p => p.Active), p =>p.StartPolling()));

// Start the task.
taskA.Start();

, вы можете узнать больше о параллельной библиотеке задач ЗДЕСЬ

РЕДАКТИРОВАТЬ: Вам необходимо включить это пространство имен: System.Threading.Tasks

РЕДАКТИРОВАТЬ2: Да, как прокомментировано, вероятно, было бы лучше, если вы используете

Task.Factory.StartNew(() =>{ Parallel.ForEach(Pollers.Where(p => p.Active);})

однако вы должны знать, что это НЕ всегда лучший способ, в зависимости от кода, посмотрите ЭТОТ БЛОГ MSDN , чтобы узнать больше о разнице между этими двумя

0 голосов
/ 15 марта 2011

Я бы предпочел использовать Thread, а не BackgroundWorker.

...