好了,所以该解决方案的体系结构将依赖于一两件事:确实每队列项的处理时间根据不同项目的数据?
如果没有,那么你可以拥有的东西,处理线程之间仅仅是圆知更鸟。这将很容易实现。
如果处理时间也有所不同,那么你会需要更多的一个“下一个可用”的感觉它的东西,所以无论你的线程恰好是免费的第一被赋予处理数据项的工作。
工作过说出来,然后你将有怎样一个队列读取器和处理线程之间同步的周围通常运行。 'next-available'和'round-robin'之间的区别在于你如何进行同步。
我不是太熟悉C#,但我听说兽告诉叫做后台工作。这很可能是一个可以接受的方法。
对于循环赛,只启动每个队列项的后台工作,在存储阵列中的工人引用。只限于16位正在进步的后台工作人员。这个想法是,你已经开始了16,然后等待第一个完成,直到17号开始,等等。我相信后台工作者实际上是作为线程池上的作业运行的,所以这会自动地限制实际运行的线程数量,以适应底层硬件的需求。要等待后台工作人员,请参阅this。等待后台工作人员完成后,您会处理结果并开始另一个工作。
对于下一个可用的方法,它没有那么不同。与其等待第一个完成,您将使用WaitAny()等待任何工作人员完成。你从任何一个完成处理返回,然后开始另一个回到WaitAny()。
这两种方法的一般理念是保持一些线程一直在沸腾。下一个可用方法的特点是,您发出结果的顺序不一定与输入项目的顺序相同。如果那么重要,那么比CPU核心拥有更多后台工作人员的循环方法将会相当高效(线程池将会刚刚开始调试,但还没有运行的工作人员)。然而,延迟会随处理时间而变化。
BTW 16是根据您认为在运行该软件的PC上有多少核心来选择的任意数字。更多的核心,更大的数量。
当然,在看似不安定且不断变化的.NET世界中,现在可能有更好的方法来做到这一点。
祝你好运!
有几个部分对此,太多地址在一个职位。将任务分解为更小的部分,然后编写代码,然后在遇到较小的部分时发布更具体的问题。 – mbeckish 2013-03-17 01:12:03
如果你的数据库是MSSQL 2005或更新的,我建议寻找Service Broker。 – 2013-03-17 01:19:53