C# 一次下载多个文件,无显式控件

C# 一次下载多个文件,无显式控件,c#,asynchronous,download,C#,Asynchronous,Download,我希望从一个网站下载大约100000个文件。来自的答案与我尝试的问题相同 我尝试了两种方法,都使用了非常不稳定的带宽: 第一次尝试同步下载文件: ParallelOptions a = new ParallelOptions(); a.MaxDegreeOfParallelism = 30; ServicePointManager.DefaultConnectionLimit = 10000; Parallel.For(start

我希望从一个网站下载大约100000个文件。来自的答案与我尝试的问题相同

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

第一次尝试同步下载文件:

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

        Parallel.For(start, end, a, i =>
            {
                using (var client = new WebClient())
                {
                    ...
                }
            });
这是可行的,但我的吞吐量如下所示:

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

我的吞吐量现在如下所示:

有没有一种很好的方法可以做到这一点,当速度下降时,它开始下载另一个文件,当聚合速度不变时,它停止添加文件(就像您希望下载管理器所做的那样)

此外,尽管第二种形式给出了更好的结果,但我不喜欢使用信号量,因为它容易出错

做这件事的标准方法是什么

注意:这些都是小文件(
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; }
    }