gpt4 book ai didi

c# - 同时执行 4 个任务,每个任务完成时自动启动另一个任务

转载 作者:行者123 更新时间:2023-11-30 19:27:27 25 4
gpt4 key购买 nike

我有一个包含 100 个网址的列表。我需要获取这些网址的 html 内容。假设我不使用 DownloadString 的异步版本,而是执行以下操作。

var task1 = SyTask.Factory.StartNew(() => new WebClient().DownloadString("url1"));

我想要实现的是一次获取最多 4 个 url 的 html 字符串。

我为前四个网址启动了 4 个任务。假设第二个 url 完成,我想立即为第五个 url 启动第五个任务。等等。这样最多只能下载 4 个 url,并且出于所有目的,总是会下载 4 个 url,即直到处理完所有 100 个 url。

我似乎无法想象我将如何真正实现这一目标。必须有一个既定的模式来做到这一点。想法?

编辑:

根据@Damien_The_Unbeliever 关于使用 Parallel.ForEach 的评论,我写了以下内容

var urls = new List<string>();
var results = new Dictionary<string, string>();
var lockObj = new object();
Parallel.ForEach(urls,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
url =>
{
var str = new WebClient().DownloadString(url);
lock (lockObj)
{
results[url] = str;
}
});

我认为上面的内容比创建单个任务和使用信号量来限制并发更好。也就是说,我从未使用过或使用过 Parallel.ForEach,我不确定这是否正确地完成了我需要做的事情。

最佳答案

SemaphoreSlim sem = new SemaphoreSlim(4);
foreach (var url in urls)
{
sem.Wait();
Task.Factory.StartNew(() => new WebClient().DownloadString(url))
.ContinueWith(t => sem.Release());
}

关于c# - 同时执行 4 个任务,每个任务完成时自动启动另一个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18567163/

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