【发布时间】:2014-01-24 19:09:11
【问题描述】:
我正在尝试实现某种具有不同任务权重的任务队列,允许不同数量的任务根据其权重同时运行。
有两种类型的任务:长任务和短任务。 最多可以同时执行 N 个短任务。
长任务出现时,如果没有其他长任务在运行,则立即启动,否则等待其完成。
如果有长任务运行,并发短任务计数限制应减少到 M。 已经运行的短任务应该继续运行直到完成;但如果当前限制小于或等于当前正在运行的短任务量,则不应启动新的短任务。
看起来,我基本上需要动态改变信号量“容量”的能力。 只需在需要时占用/释放 (N - M) 个“槽”就可以很容易地减少/增加容量,但是如果有 N 个短任务完成,这将导致队列在 (N - M) 个短任务完成之前“挂起”任务已在运行。
我还可以实现某种“调度程序”,每 100 毫秒唤醒一次(例如)并检查队列中是否有任何现在可以开始的任务。这种方法的缺点是在任务入队和启动之间有长达 100 毫秒的延迟。
所以我被这个难题困住了,希望有人对如何实现它有一些新的想法。
更新: 任务不会产生任何显着的 CPU 负载。 它们实际上是 HTTP 请求。长请求是上传文件,短请求是常见的 HTTP 请求。
【问题讨论】:
-
如果您不想重新发明轮子并使用 .NET 4.5,您可以使用TPL(任务并行库)和Task Schedulers
-
我不想重新发明轮子。但似乎 TaskScheduler 无法帮助我完成我想要实现的目标。还是我错过了什么?
-
我已更新问题以添加有关任务性质的更多详细信息。
标签: c# multithreading concurrency task