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

本文关键字:创建 新任务 何限制 并行任务 | 更新日期: 2023-09-27 18:27:43

在我的程序中,我一个接一个地启动并行任务(http请求),远远领先于这些任务可能返回的任何实际结果。

看起来像

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

当然,通过这种方式,我安排的任务比可以处理的任务多得多,所以当我通过取消令牌取消它们时,只取消它们需要很多时间——它们毕竟是安排好的,所以它们必须实际运行才能被取消。

我如何组织任务创建,以便始终只有有限的一组任务可以运行,而新任务只有在有"位置"时才能安排?我的意思是,一些"直接"的方式,像

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

这可能吗?

编辑:

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

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

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

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

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

这将帮助你

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

有限并发级别的任务调度程序(具有任务优先级)处理包装任务