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

C# 创建并行任务时,如何限制新任务的创建?,c#,multithreading,task,C#,Multithreading,Task,在我的程序中,我一个接一个地启动并行任务(http请求),这样做远远超过这些任务返回的任何实际结果 看起来像 while (continueTaskSwarming == true) { Task.Run(() => Task()); } 当然,这样我安排的任务比可以处理的任务多得多,所以当我通过取消令牌取消它们时,仅仅取消它们需要很多时间——它们毕竟是计划好的,所以它们必须在被取消之前实际运行 我如何组织任务创建,使准备运行的任务总是有限的,只有在有“位置”时才安排新任务?我是

在我的程序中,我一个接一个地启动并行任务(http请求),这样做远远超过这些任务返回的任何实际结果

看起来像

while (continueTaskSwarming == true)
{
    Task.Run(() => Task());
}
当然,这样我安排的任务比可以处理的任务多得多,所以当我通过取消令牌取消它们时,仅仅取消它们需要很多时间——它们毕竟是计划好的,所以它们必须在被取消之前实际运行

我如何组织任务创建,使准备运行的任务总是有限的,只有在有“位置”时才安排新任务?我是说,一些“直”的方式,比如

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

编辑:


我认为,最明显的方法是将创建的所有任务放入某个列表中,在完成时将其删除,并检查活动/计划任务的计数。但我不知道(也不知道谷歌搜索它的关键词)是否可以从任务本身或ContinueWith()方法中“删除”任务。有人知道吗?

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


另一种方法是使用
信号量
同步对象。这基本上做了相同的事情,但封装在一个易于使用的对象中。您将创建一个新的信号量,指定希望一次能够持有锁的并发线程数。通过让每个任务锁定信号量,您可以让任务生成器也锁定信号量,当您读取最大任务数时,生成器将无法继续并创建另一个任务,直到当前运行的任务之一完成。

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

这对你有帮助


除非您有一个非常具体的限制,即您想控制自己,否则我假设线程池会自动执行某种节流。stakx:当然会,但据我所知,它只适用于实际运行的任务,但它不能阻止我调度万亿个任务。实际上,我想安排几乎“无限”的任务计数,只在停止的条件下停止。但是,有1000个计划任务是没有意义的,所以我想限制它。不鼓励只提供链接的答案,判断你的答案是否可以被视为“只提供链接的答案”的最好方法是暂时删除问题中的所有链接,并问自己“这个问题仍然有用吗?”答案中的链接应该假设其中的所有链接都将失效,并且答案需要至少包含足够的信息,以便其他人能够通过答案中提供的摘要信息自己找到详细信息。