【问题标题】:Httpclient tpl parallel multiple request fastest wayHttpclient tpl并行多个请求最快的方式
【发布时间】:2015-03-25 18:20:01
【问题描述】:

我想下载 url 列表的网页内容(10 000 个 url)。

  1. httpCLient 是最快和最干净的方式(而不是 httpwebrequest 或 webclient)吗?
  2. 如果我想快速,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();
    }

问题

  1. 配置等待?我应该使用

    var data = await httpClient.GetStringAsync(url).ConfigureAwait(false);

var 数据 = 等待 httpClient.GetStringAsync(url);

  1. ServicePointManager.DefaultConnectionLimit?我也应该更改此属性吗?

【问题讨论】:

  • 请澄清您的要求,也许是一个代码示例。目前,我不知道你实际上想做什么。
  • @iVision 我编辑了我的问题以便更清楚
  • @PanagiotisKanavos,请随意单击我发布的链接以了解我的意思。它不是一一做的。这是关于使用自然异步、非阻塞 API,例如 HttpClient.GetStringAsync,而不是与 Parallel.ForEach 并行调用像 WebClient.DownloadString 这样的阻塞 API。
  • @PanagiotisKanavos async/await 或多或少是 TPL 上的语法糖 并非如此。 async-await 根本不绑定到 TPL,与并行无关。

标签: c# task-parallel-library httpclient


【解决方案1】:

有一个 ParallelOptions.MaxDegreeOfParallelism 属性指定最大并发操作数:

Parallel.ForEach(list, 
        new ParallelOptions { MaxDegreeOfParallism = 4 }, 
        DownloadPage);

参考:MaxDegreeOfParallism

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2021-02-25
    • 2017-10-04
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多