有一个异步下载许多文件的循环:
privare void MyLogic(...) {
int start = 5, end = 150;
string filepath = @"somepath", url=@"someurl", ext = ".zip";
for (int i = start; i<= end; i++)
{
LoadFile(filepath + @"\" + i.ToString("D4"), url + i.ToString() + ext);
}
//вот тут я хочу выполнить обработку только после того, как все загрузки будут завершены
}
private void LoadFile(string url, string path)
{
try
{
using (WebClient client = new WebClient())
{
client.DownloadFileCompleted += (s, e) =>
{
Console.WriteLine(url + " success");
};
client.DownloadFileAsync(new Uri(url), path); //асинхронная загрузка
}
}
catch
{
Console.WriteLine(url + " error"); //досадно, но продолжаем
}
}
循环之后,我想在文件系统级别处理已下载的内容。如何重写代码以准确了解所有文件的成功下载完成时间?
所以对于初学者来说,你需要
LoadFile
通过制作来改变Task
,而不是void
。例如,所以在这里,
MyLogic
有三个选项:1)我们依次一个一个地执行所有的下载,但是是异步的
2) 一次运行所有 100500 次下载并等待它们完成
3)同样的,同时运行未知数量的任务不是很体面。为此,发明了节流模式(链接到维基百科)。当然,你可以自己实现,也可以使用Task Parallel Libraray.Dataflow库(链接到nuget)
这是一个完整的代码异步示例并使用
System.Net.Http.HttpClient
.控制台应用程序,.NET Core 3.1 (C# 8.0)
带有注释的完整应用程序代码
如果异步比较困难
Main
,那么这里是通常的同步