在新线程中启动Parallel.ForEach的好形式

时间:2011-03-15 15:56:47

标签: c# multithreading parallel-processing

我正在开发一个Windows服务项目。该服务启动引擎。引擎有一对多的“轮询器”,我想每个都在自己的线程中运行,这样它们就可以并行进行“轮询”。我在引擎的Start()方法中使用Parallel.ForEach来获取轮询器轮询并且工作正常。我希望服务能够启动引擎,然后继续做其他事情(比如报告引擎的状态以及它在不同点或其他方面的轮询)。这是在没有主线程被阻止的情况下启动引擎的最佳方法:

    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 个答案:

答案 0 :(得分:5)

我选择.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();

您可以阅读有关Task Parallel Library HERE

的更多信息

编辑:您需要包含此命名空间:System.Threading.Tasks

EDIT2:是的,如果使用

,评论可能会更好

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

然而你应该知道它并不总是最好的方式,取决于代码,查看THIS MSDN BLOG以阅读更多关于两者之间的差异

答案 1 :(得分:-1)

我更喜欢使用Thread而不是BackgroundWorker。