我有一个代理列表,每个代理进入各个站点并从站点中提取所需的数据.目前它一次只做这个.但我希望一次运行10到20个任务,因此它可以一次性从20个站点下载,而不只是一个.
这是我目前正在做的事情:
private async Task<string> DownloadDataFromSite(string url)
{
// (await) Do Work.
return HTMLSourceCode;
}
Run Code Online (Sandbox Code Playgroud)
然后我循环遍历代理
foreach(Proxy p in proxies)
{
string source = await DownloadDataFromSite(site);
}
Run Code Online (Sandbox Code Playgroud)
是Parallel.ForEach适合这样的任务?我试过了,但我现在遇到的问题是无法做到的await.
一种方法是避免在foreach中等待.问题是你await有效地阻止了你的执行.更好的方法可能是这样的:
await Task.WhenAll(proxies.Select(p => DownloadDataFromSite(site)));
Run Code Online (Sandbox Code Playgroud)
这意味着您将立即等待所有任务,这意味着异步I/O将并行发生.请注意,如果您正在进行CPU工作,则不会真正实现并行化.
关键是,异步I/O(例如下载网页)不需要更多线程并行运行.另一方面,Parallel.ForEach实际上是用于CPU绑定工作,而不是I/O绑定工作,它确实在多个线程上执行代码.
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |