2010-08-14 83 views
1

有一个集合,该集合的每个元素都被发送到一个函数,其中有5个线程必须处理它。在迭代过程中使用线程

如何使5个线程在传递的项目上工作?

foreach(var item in collection) 
{ 
    doSomeWork(item); 
} 

void doSomeWork(object item) 
{ 
    //here i have to do something with the passed 'item' by using 5 threads 
} 
+2

您使用的是什么版本的C#?这可以使用并行扩展轻松完成。 – Oded 2010-08-14 15:08:42

+2

@trnTrash:解释你为什么需要5个线程?这5件事是什么逻辑/过程?为什么不使用.NET内置的并行化?让编译器找出最好的方法。 – 2010-08-14 15:12:58

+1

线程不“在事物上工作”。它们是代码可以“并行”运行的“地方”。听起来好像我很迂腐,但有一个可能性,就是你的一半问题是你试图解决错误的“问题”!你没有5个线程需要在物品上工作,你有5个物品需要在物品上工作。在你开始考虑这5个物体是否可以同时处理这些物品之前,你需要知道它们中的任何一个是否会改变物品的状态。 – 2010-08-14 15:29:24

回答

1
foreach (var item in collection) 
{ 
    for (var i = 0; i < 5; i++) 
    { 
     ThreadPool.QueueUserWorkItem(doSomeWork, item); 
    } 
} 
+0

在这种情况下,我得到了一个错误,即某个文件上的作业无法完成,因为另一个进程正在使用该文件。 – trnTash 2010-08-14 18:05:32

+2

你在说什么文件?在你的问题中你没有提到这样的事情。你问了如何为给定集合中的每个项目运行5个线程,并且我回答了它。很明显,你不能从不同的线程/进程写入同一个文件。 – 2010-08-14 19:11:58

1

在.NET 4中,你可以使用并行LINQ:

Parallel.ForEach(collection, item => { 
    // process each item 
}); 

这将使用并行扩展的(PFX)启发式从线程池调度的一个或多个工人。

+0

这是净3.5,不幸:( – trnTash 2010-08-14 18:07:14

+0

我想你的意思是幸运?? – 2010-08-14 18:22:57