限制自我扩展任务

时间:2010-07-06 06:37:36

标签: c# multithreading

后台:我正在使用.NET 4.0和新的Task类。使用在http://msdn.microsoft.com/en-us/library/ee789351.aspx找到的代码我实现了一个任务调度程序,它限制了执行的并发线程数。我还修改了代码,使用BlockingCollection而不是LinkedList作为我的任务列表,这样我就可以限制挂起任务列表的大小。我的每个任务都可能产生其他任务。因此,任务A可以生成任务B,C和D.

问题:在将任务B,C和D添加到队列之前,任务A在技术上并不完整,但如果队列已满,则A阻塞。那么,如何使用具有自扩展任务的有限任务队列?

我需要限制队列大小的原因是它会爆炸我的内存使用。单个任务可以产生数千个其他任务。 10-15个任务,每个排队成千上万......你得到了图片。

建议将不胜感激!

谢谢, 丹

3 个答案:

答案 0 :(得分:3)

  

如何使用自我扩展任务创建有限的任务队列

我会说你没有;也就是说,您的要求彼此冲突。如果必须对待处理任务的数量有硬性限制,那么必须接受尝试挂起新任务可以阻止(现在)或失败。

如果“单个任务可以产生数千个其他任务”,那么您必然会有大量未完成的工作。任务队列的目的是充当待处理工作的地方。但是,因为(我希望)大多数任务不会挂起数以千计的新任务,随着时间的推移,待处理工作量将减少,最终变为零。

从某种意义上说,拥有待处理任务队列的一个要点就是可以在不考虑当前可用处理时间的情况下完成新的查找。就内存使用而言,等待队列中的数千个项目应该不是问题。数百万可能,但即便如此 - 你有没有想过并证明这是一个问题?

答案 1 :(得分:0)

我建议使用有限的“主”队列,任何依赖的任务都在一个单独的无限“从属”队列中运行。因此,任务A进入“主”队列,但其他任务在“从属”队列中创建。

为了保持限制,您仍然会停止超过(例如)10个在主队列中排队的任务:或者如果从站中有超过30个任务,您可以停止将任何内容添加到主队列中队列中。

希望有所帮助 - 如果您对此答案有任何疑问,请在此发表评论,我将很乐意为您提供帮助或提供示例!

答案 2 :(得分:0)

您可能在任务计划程序中有两个任务列表:PrimaryTasks和SecondaryTasks,每个都有不同的限制。
对主要任务有一个小的限制,但对次要任务有更大的限制。由于次要任务没有扩展,我认为它们不会阻塞,因此主要任务也将逐渐完成。