我有一个包含 100 个网址的列表。我需要获取这些 url 的 html 内容。可以说我不使用异步版本,DownloadString
而是执行以下操作。
var task1 = SyTask.Factory.StartNew(() => new WebClient().DownloadString("url1"));
我想要实现的是一次最多获取 4 个 url 的 html 字符串。
我为前四个 url 启动了 4 个任务。假设第 2 个 url 完成,我想立即为第 5 个 url 启动第 5 个任务。等等。这种方式最多只能下载 4 个 url,并且出于所有目的,总是会下载 4 个 url,即直到处理完所有 100 个。
我似乎无法想象我将如何实际实现这一目标。必须有一个既定的模式来做到这一点。想法?
编辑:
跟进@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
,我不确定这是否正确地完成了我需要做的事情。