并行运行多个任务

Jam*_*ery 2 c#

我有一个代理列表,每个代理进入各个站点并从站点中提取所需的数据.目前它一次只做这个.但我希望一次运行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.

Lua*_*aan 5

一种方法是避免在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绑定工作,它确实在多个线程上执行代码.