创建并行任务,如何限制新任务的创建?

时间:2014-10-24 06:24:40

标签: c# multithreading task

在我的程序中,我逐个启动并行任务(http请求),远远超过这些任务可以返回的任何实际结果。

看起来像是

while (continueTaskSwarming == true)
{
    Task.Run(() => Task());
}

当然,这样我可以安排比可以处理的任务更多的任务,所以当我通过取消令牌取消它们时,只需要花费很多时间来取消它们 - 毕竟它们已经安排好了,所以它们必须实际运行在它们被取消之前。

如何组织任务创建,以便始终只有有限的一堆任务可以运行,只有当某些"地点"对他们?我的意思是,有些"直"方式,像

while (continueTaskSwarming == true)
{
    PauseUntilScheduledTaskCountIsLowerThan(100);
    Task.Run(() => Task());
}

这可能吗?

编辑:

我认为,显而易见的方法是将创建的所有任务放入某个列表中,在完成时删除它们并检查活动/计划任务的计数。但我不知道(并且不知道谷歌的关键词)如果我可以"删除"任务来自自身,或来自ContinueWith()方法。有人知道吗?

2 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。您可以使用锁定保护计数器(当前任务),使用Monitor.Wait()使任务生成线程等到计数器递减并且启动另一个任务是安全的。

另一种方法是使用Semaphore同步对象。这基本上是相同的,但封装在一个易于使用的对象中。您创建一个新的信号量,指定您希望一次保持锁的并发线程数。通过让每个任务锁定信号量,然后你可以让任务生产者也锁定信号量,当你读取最大任务数时,生产者就不能继续创建另一个任务,直到其中一个当前正在运行的任务完成。

答案 1 :(得分:0)

如果我理解正确,您正在尝试在执行任务时实现有限的并发性

这会对你有所帮助

http://msdn.microsoft.com/en-us/library/ee789351(v=vs.110).aspx

Limited concurrency level task scheduler (with task priority) handling wrapped tasks