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

Jer*_*ter 2 c# parallel-processing multithreading

我正在开发一个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();
Run Code Online (Sandbox Code Playgroud)

或者有没有人有更好的方法来做到这一点?

Fra*_*ega 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();
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读有关任务并行库的更多信息

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

EDIT2:是的,如果您使用的话可能会更好

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

但是你应该知道它并不总是最好的方式,取决于代码,查看 这个MSDN博客,阅读更多有关两者之间的差异

  • 这是我的建议,除了我建议使用`Task.Factory.StartNew(()=> ...`而不是手动创建和启动任务.这是用于"启动"热门任务的建议API (至少在vNext中添加Task.Run之前). (2认同)