一次下载多个文件,没有明确的控件

时间:2013-07-30 01:00:45

标签: c# asynchronous download

我希望从网站下载大约100,000个文件。 this qustion的答案与我尝试过的问题相同。

我尝试了两种方法,两种方法都使用了极不稳定的带宽:

首次尝试同步下载文件:

        ParallelOptions a = new ParallelOptions();
        a.MaxDegreeOfParallelism = 30;
        ServicePointManager.DefaultConnectionLimit = 10000;

        Parallel.For(start, end, a, i =>
            {
                using (var client = new WebClient())
                {
                    ...
                }
            });

这有效,但我的吞吐量如下: enter image description here

第二种方法涉及使用信号量和异步来更多地手动执行并行操作(没有信号量,它显然会产生太多的工作项):

Parallel.For(start, end, a, i =>
        {
            list.Add(getAndPreprocess(/*get URL from somewhere*/);
        });

...

static async Task getAndPreprocess(string url)
    {
        var client = new HttpClient();
        sem.WaitOne();
        string content = "";
        try
        {
            var data = client.GetStringAsync(url);
            content = await data;
        }
        catch (Exception ex) { Console.WriteLine(ex.InnerException.Message); sem.Release(); return; }
        sem.Release();
        try
        {
            //try to use results from content
        }
        catch { return; }
    }

我的吞吐量现在看起来像这样: enter image description here

有没有一种很好的方法可以做到这一点,以便在速度下降时开始下载其他文件,并在聚合速度不变时停止添加(就像你期望下载管理员做的那样)?

此外,即使第二种形式提供更好的结果,我也不喜欢使用信号量,因为它容易出错。

这样做的标准方法是什么?

注意:这些都是小文件(<50KB)

0 个答案:

没有答案