限制许多.NET Task实例的最佳方法是什么?

时间:2011-02-17 21:27:03

标签: .net multithreading scheduling task

我创建了大量的Task实例。我需要全部运行它们,等待它们全部完成。问题是我需要确保在任何给定时间“开始”和“完成”之间不超过X个任务;这些任务涉及对同时呼叫数量有限制的其他方的呼叫。由于这些限制不是基于我的硬件,我不能依赖任何内置的智能节流;我需要严格执行限制。我已经能够通过让任务以线程安全的方式递增和递减共享变量来实现这一点,但它似乎不必要地繁琐。是否有一种直接内置于API的方法,或者我缺少的简单同步工具?

2 个答案:

答案 0 :(得分:4)

您必须创建自己的任务计划程序,请参阅How to: Create a Task Scheduler That Limits the Degree of Concurrency

编辑:这需要比使用Semaphore更多的代码,但我觉得这可能会更好,因为执行任务的线程池不知道你的信号量,但使用TaskScheduler正在播放根据他们的规则。

编辑2:使用信号量的一个可能的缺点是线程池可能认为您的任务正在执行IO操作并一次安排它们(以便它们挂在那里等待,因为他们不需要CPU)。使用TaskScheduler时,它们将在有空位时准确安排。它肯定会让泳池更清洁。

答案 1 :(得分:1)

Semaphore类可能适合您:http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

此MSDN页面上有一个很好的示例,向您展示如何使用它。

也可以使用更轻量级的内置线程池/同步机制来完成同样的目的,但Semaphore基本上是为满足您的要求而设计的。