【发布时间】:2015-03-25 18:20:01
【问题描述】:
我想下载 url 列表的网页内容(10 000 个 url)。
- httpCLient 是最快和最干净的方式(而不是 httpwebrequest 或 webclient)吗?
- 如果我想快速,TPL 是最好的方法吗?
我正在寻找类似的东西,但非常快速和干净(10 000 个请求)?
public List<string> GetContentListOfUrlList(List<Uri> uriList, int maxSimultaneousRequest)
{
//requesting url by the fastest way
}
我希望这样更好;)
编辑 2: 根据 noseratio other post 是最好的解决方案吗?
public async Task<List<string>> DownloadAsync(List<Uri> urls, int maxDownloads)
{
var concurrentQueue = new ConcurrentQueue<string>();
using (var semaphore = new SemaphoreSlim(maxDownloads))
using (var httpClient = new HttpClient())
{
var tasks = urls.Select(async (url) =>
{
await semaphore.WaitAsync();
try
{
var data = await httpClient.GetStringAsync(url);
concurrentQueue.Enqueue(data);
}
finally
{
semaphore.Release();
}
});
await Task.WhenAll(tasks.ToArray());
}
return concurrentQueue.ToList();
}
问题
-
配置等待?我应该使用
var data = await httpClient.GetStringAsync(url).ConfigureAwait(false);
var 数据 = 等待 httpClient.GetStringAsync(url);
- ServicePointManager.DefaultConnectionLimit?我也应该更改此属性吗?
【问题讨论】:
-
请澄清您的要求,也许是一个代码示例。目前,我不知道你实际上想做什么。
-
@iVision 我编辑了我的问题以便更清楚
-
@PanagiotisKanavos,请随意单击我发布的链接以了解我的意思。它不是一一做的。这是关于使用自然异步、非阻塞 API,例如
HttpClient.GetStringAsync,而不是与Parallel.ForEach并行调用像WebClient.DownloadString这样的阻塞 API。 -
@PanagiotisKanavos async/await 或多或少是 TPL 上的语法糖 并非如此。
async-await根本不绑定到 TPL,与并行无关。
标签: c# task-parallel-library httpclient