创建并行任务,如何限制新的任务创建?
在我的程序中,我逐个开始并行任务(http请求),在任何可以返回的实际结果之前执行。
看起来像
while (continueTaskSwarming == true)
{
Task.Run(() => Task());
}
当然,我有更多的任务可以处理,因此当我通过取消标记取消它们时,需要很长时间才能取消它们 - 它们都是按计划完成的,因此它们必须在可以运行之前实际运行被取消。
我如何组织任务创建,以便始终只有有限的一堆任务可以运行,新任务只有在他们有一些“位置”时才会计划? 我的意思是,一些“直线”的方式,就像
while (continueTaskSwarming == true)
{
PauseUntilScheduledTaskCountIsLowerThan(100);
Task.Run(() => Task());
}
那可能吗?
编辑:
我认为明显的方法是将创建的所有任务都放入一个列表中,在完成时删除它们并检查活动/计划任务的数量。 但是我不知道(也不知道关键字是谷歌它)如果我可以从它自己或从ContinueWith()方法“删除”任务。 有谁知道?
有很多方法可以做到这一点。 您可以使用Monitor.Wait()
来保护一个带有锁的计数器(当前任务),让任务生成线程等待,直到计数器递减并且可以安全地开始另一个任务。
另一种方法是使用Semaphore
同步对象。 这基本上是一样的东西,但封装在一个易于使用的对象。 您可以创建一个新的信号量,指定想要同时拥有多少个并发线程。 通过让每个任务锁定信号量,然后你可以让任务生产者锁定信号量,当你读取最大数量的任务时,生产者将无法继续并创建另一个任务,直到当前正在运行的任务完成。
如果我理解正确,那么您正在尝试在执行任务时实现有限的并发
这会帮助你
http://msdn.microsoft.com/en-us/library/ee789351(v=vs.110).aspx
有限的并发级别任务调度程序(具有任务优先级)处理包装的任务
链接地址: http://www.djcxy.com/p/52797.html上一篇: Creating parallel tasks, how to limit new task creation?