繁体   English   中英

并行运行多个任务

[英]Running Multiple Tasks in Parallel

我有一个代理列表,每个代理都转到各个站点,并从站点中提取所需的数据。 目前,它一次执行一次。 但是我想一次运行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()代码内进行异步/等待?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM