【发布时间】:2019-11-29 20:44:00
【问题描述】:
我正在尝试同时下载多个文件。但是所有文件都在不断地下载。所以,首先这个文件下载@"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}");
}
}
但是,当我在我的文件系统中查看时,我看到文件正在逐个、逐个地下载,而不是同时下载:
另外,我尝试使用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());
}
}
你能告诉我如何同时下载吗?
任何帮助将不胜感激。
【问题讨论】:
-
通过调用
GetAwaiter().GetResult();,您正在同步运行您的代码。您使用的是哪个 .NET 版本?HttpClient和async Main()呢? -
@PavelAnikhouski 我正在使用 .NET 4.6。你能说明怎么可能吗?有没有更好的方法?
-
尝试将
Main定义为static async Task Main(string[] args),然后在里面调用`await DownloadFiles();`
标签: c# asynchronous async-await task-parallel-library parallel.foreach