信号量动态调整大小C#

时间:2011-04-08 20:10:19

标签: c# dynamic semaphore resize

我正在尝试使用信号量来控制可以同时运行多少个作业实例。虽然使用wait方法这很简单,但我还希望在运行时可以配置该值,以便我可以向上或向下计数。

我意识到可能存在导致倒计时的问题但有没有办法实际执行此操作?这是使用信号量的正确方法吗?

2 个答案:

答案 0 :(得分:2)

根据ReleaseSemaphore的文档,lReleaseCount参数:

  

信号量对象当前计数增加的量。该值必须大于零。 如果指定的数量会导致信号量的计数超过创建信号量时指定的最大计数,则计数不会更改,函数返回FALSE。

这个以及其他文档表明,信号量不是您的限制的正确选择。信号量一旦创建,就具有难以在不重新创建信号量的情况下更改的最大值。换句话说,它不是可以更改的动态值

您需要在此方案中找到另一种管理限制的方法。

将可用数量减少到您目前所需的数量。当你想增加可用实例的数量时,只需释放一些你在开头抓到的实例。

但是,我怀疑你为什么要这样做。真正决定你可以在同一时间执行多少工作的限制因素是什么?很可能信号量不是正确的答案。

答案 1 :(得分:1)

  

虽然使用wait方法这很简单,但我也希望在运行时可以配置该值,以便我可以向上或向下计数。

我不建议使用信号量。

如果您使用的是.NET 4,我建议的方法是创建一个自定义TaskScheduler,它允许您在运行时更改并发级别。然后,您可以使用在选项中传递此TaskScheduler的单Parallel.For / ForEach调用来运行整个操作,并在运行时更改并发级别。

这样可以很容易地处理向上或向下移动的水平。当级别上升时,您只需根据需要添加新线程。当它们发生故障时,只需从内部集合中删除该线程(但不要停止它),并让它完成当前的工作。这将允许您根据需要进行缩放。