并行运行多个任务
本文关键字:任务 运行 并行 | 更新日期: 2023-09-27 18:03:57
我有一个代理列表,每个代理到不同的站点并从站点提取所需的数据。目前它是一次做一个。但是我希望同时运行10 - 20个任务,这样就可以一次从20个站点下载,而不是只从一个站点下载。
我现在是这样做的:
private async Task<string> DownloadDataFromSite(string url)
{
// (await) Do Work.
return HTMLSourceCode;
}
然后遍历代理
foreach(Proxy p in proxies)
{
string source = await DownloadDataFromSite(site);
}
Parallel.ForEach
是否适合这样的任务?我已经尝试过了,但是我现在遇到的问题是无法await
。
一种方法是避免在foreach中等待。问题是你的await
有效地阻碍了你的执行。一个更好的方法可能是这样的:
await Task.WhenAll(proxies.Select(p => DownloadDataFromSite(site)));
这将意味着您将同时等待所有任务,这意味着异步I/O将并行发生。请注意,如果你也在做CPU工作,那将不会真正并行化。
关键是,异步I/O(比如下载一个网页)不需要更多的线程并行运行。另一方面,Parallel.ForEach
实际上用于cpu绑定的工作,而不是I/O绑定的工作,并且它确实在多个线程上执行代码。
PArallel.ForEach
不能很好地工作,因为它期望一个同步lambda,而给它一个异步lambda基本上会导致它一启动就返回。有一种绕过它的方法,检查这个问题:在一些。net Parallel.ForEach()代码中做一些async/await是可以的吗?