如何同时正确下载文件?

问题描述 投票:2回答:1

我正在尝试同时下载多个文件。但是,所有文件都会依次下载。因此,首先下载此文件@"http://download.geofabrik.de/europe/cyprus-latest.osm.pbf",然后开始下载该文件@"http://download.geofabrik.de/europe/finland-latest.osm.pbf",,下一个要下载的文件是@"http://download.geofabrik.de/europe/great-britain-latest.osm.pbf",依此类推。

但是我想下载同时

所以我有以下基于the code from this answer的代码:

static void Main(string[] args)
{
    Task.Run(async () =>
    {
        await DownloadFiles();
    }).GetAwaiter().GetResult();
}

public static async Task DownloadFiles()
{
    IList<string> urls = new List<string>
    {
        @"http://download.geofabrik.de/europe/cyprus-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/finland-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/great-britain-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/belgium-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/belgium-latest.osm.pbf"
    };

    foreach (var url in urls)
    {
        string fileName = url.Substring(url.LastIndexOf('/'));
        await DownloadFile(url, fileName);
    }            
}

public static async Task DownloadFile(string url, string fileName)
{
    string address = @"D:\Downloads";
    using (var client = new WebClient())
    {
        await client.DownloadFileTaskAsync(url, $"{address}{fileName}");
    }
}

但是,当我在文件系统中看到文件时,我看到文件正在下载依次一个接一个地]],而不是同时下载:

enter image description here

此外,我尝试使用this approach,但是没有同时下载:

static void Main(string[] args)
{
    IList<string> urls = new List<string>
    {
        @"http://download.geofabrik.de/europe/cyprus-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/finland-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/great-britain-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/belgium-latest.osm.pbf",
        @"http://download.geofabrik.de/europe/belgium-latest.osm.pbf"
    };

    Parallel.ForEach(urls,
        new ParallelOptions { MaxDegreeOfParallelism = 10 },
        DownloadFile);
}

public static void DownloadFile(string url)
{
    string address = @"D:\Downloads";
    using (var sr = new StreamReader(WebRequest.Create(url)
           .GetResponse().GetResponseStream()))
    using (var sw = new StreamWriter(address + url.Substring(url.LastIndexOf('/'))))
    {
        sw.Write(sr.ReadToEnd());
    }
}

您能告诉我如何同时下载吗?

任何帮助将不胜感激。

我正在尝试同时下载多个文件。但是,所有文件都会依次下载。因此,首先,此文件下载了@“ http://download.geofabrik.de/europe/cyprus-latest.osm ....

c# asynchronous async-await task-parallel-library parallel.foreach
1个回答
3
投票

Eldar的解决方案可以进行一些小的编辑。这是已编辑的完整的DownloadFiles方法:


3
投票
    foreach (var url in urls)
    {
        string fileName = url.Substring(url.LastIndexOf('/'));
        await DownloadFile(url, fileName); // you wait to download the item and then move the next
    }   

1
投票

这将一个接一个异步下载它们。

© www.soinside.com 2019 - 2024. All rights reserved.