我的问题可能听起来有些天真,但我对多线程编程很新。
我正在编写一个处理传入外部数据的应用程序。对于到达的每个数据,将按以下方式创建新任务:
System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));
数据项非常快(每秒,半秒等等)到达,因此创建了很多任务。处理每项任务可能需要大约一分钟。在测试时,我看到线程数量一直在增加。如何限制创建的任务数,因此实际工作线程数稳定高效。我的电脑只是双核心。
谢谢!
答案 0 :(得分:2)
您的一个问题是默认调度程序会看到持续一分钟的任务,并假设它们在另一个尚未执行的任务上被阻止。为了尝试解除阻塞,它会调度更多未决任务,从而增加线程。你可以在这里做几件事:
缩短您的任务(可能不是一个选项)。
编写一个处理此方案的调度程序,但不添加更多线程。
使用SetMaxThreads来阻止 无限制的线程池增长。
请参阅此处的线程注入部分:
答案 1 :(得分:0)
您应该考虑在the producer/consumer pattern周围BlockingCollection<T>
使用ConcurrentQueue<T>
,并根据工作负载的特点将BoundedCapacity
设置为有意义的内容。您可以对BoundedCapacity
进行配置,然后在进行一些分析会话时进行调整以找到最佳位置。
虽然TPL确实会对您创建的任务进行排队,但创建太多任务并不会受到惩罚。另外,生产更多工作的重点是什么?你想要产生足够的工作,消费者永远不会饿死,但你不想远远超过自己,因为这只是浪费资源,并可能从你的消费者那里偷走那些相同的资源。
答案 2 :(得分:0)
您可以为任务并行库创建自定义TaskScheduler
,然后通过将其实例传递给TaskFactory
构造函数来计划任务。
以下是如何执行此操作的一个示例:Task Scheduler with a maximum degree of parallelism。