gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:21 31 4
gpt4 key购买 nike

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

看起来像

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

当然,这样我安排的任务比可以处理的要多,所以当我通过取消 token 取消它们时,取消它们需要很多时间 - 毕竟它们是预定的,所以它们必须实际运行在它们可以被取消之前。

我如何组织任务创建,以便始终只有有限的任务准备运行,只有在有某个“位置”时才安排新任务?我的意思是,一些“直接”的方式,比如

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

这可能吗?

编辑:

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

最佳答案

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

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

关于c# - 创建并行任务,如何限制新任务的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542549/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com