0

我的问题可能听起来有点天真,但我对多线程编程很陌生。

我正在编写一个处理传入外部数据的应用程序。对于每个到达的数据,一个新任务按以下方式创建:

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));

数据项到达速度非常快(每秒、半秒等),因此创建了很多任务。处理每项任务可能需要大约一分钟。在测试它时,我看到线程数一直在增加。如何限制创建的任务数量,使实际工作线程的数量稳定高效。我的电脑只有双核。

谢谢!

4

3 回答 3

2

您的一个问题是默认调度程序会看到持续一分钟的任务,并假设它们被其他尚未执行的任务阻塞。为了尝试解除阻塞,它会安排更多待处理的任务,从而导致线程增长。您可以在这里做几件事:

  • 缩短您的任务(可能不是一种选择)。

  • 编写一个调度程序来处理这种情况并且不添加更多线程。

  • 使用 SetMaxThreads 防止无限线程池增长。

请参阅此处的线程注入部分:

http://msdn.microsoft.com/en-us/library/ff963549.aspx

于 2011-03-24T18:37:37.000 回答
0

您应该考虑使用生产者/消费者模式,并BlockingCollection<T>ConcurrentQueue<T>其中将其设置为BoundedCapacity考虑到工作负载特征的有意义的东西。您可以进行可BoundedCapacity配置,然后在运行一些分析会话时进行调整以找到最佳位置。

虽然 TPL 确实会负责对您创建的任务进行排队,但创建太多任务并非没有惩罚。另外,产生的工作量超过你的消耗量有什么意义?您希望生产足够多的工作,使消费者永远不会挨饿,但您不想远远领先于自己,因为这只是在浪费资源,并可能从消费者那里窃取同样的资源。

于 2010-11-02T04:04:29.487 回答
0

您可以为任务并行库创建自定义TaskScheduler,然后通过将其实例传递给TaskFactory构造函数来安排任务。

以下是如何做到这一点的一个示例:具有最大并行度的任务计划程序

于 2010-11-25T07:53:58.460 回答