并行运行多个任务

本文关键字:任务 运行 并行 | 更新日期: 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是可以的吗?