Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#使用异步下载多个文件_C#_Asynchronous_Downloadfile - Fatal编程技术网

c#使用异步下载多个文件

c#使用异步下载多个文件,c#,asynchronous,downloadfile,C#,Asynchronous,Downloadfile,我有这段代码,可以很好地下载一个文件 如何为该代码添加多个要下载的文件 private void Form1_Load(object sender, EventArgs e) { WebClient client = new WebClient(); client.DownloadProgressChanged += Client_DownloadProgressChanged; client.DownloadFileCompleted += Client_Do

我有这段代码,可以很好地下载一个文件

如何为该代码添加多个要下载的文件

 private void Form1_Load(object sender, EventArgs e)
 {
     WebClient client = new WebClient();
     client.DownloadProgressChanged += Client_DownloadProgressChanged;
     client.DownloadFileCompleted += Client_DownloadFileCompleted;
     client.DownloadFileAsync(new Uri("http://download.thinkbroadband.com/10MB.zip"), @"c:\folder\10MB.zip");
 }

 private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
 {
     MessageBox.Show("completed");
 }

 private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
 {
     progressBar1.Maximum = (int)e.TotalBytesToReceive / 100;
     progressBar1.Value = (int)e.BytesReceived / 100;
 }

您可以创建多个进度条和多个web客户端。每个
WebClient
都应该使用适当的进度条。

您可以创建多个进度条和多个web客户端。每个
WebClient
都应该使用适当的进度条。

多次调用
DownloadFileAsync()
。如果您的问题是“但是如何更新我的进度条”,恭喜您,您要求的是一个无法解决的问题的答案。你事先不知道这些文件会有多大,所以你必须想一个替代方案。例如,如果要下载10个文件,请让每个文件在进度条上代表10%。()@CodeCaster:你可以用HttpWebRequest而不是WebClient发送请求。这个类更复杂,提供了更多的特性。如果服务器提供内容长度,则您可以获得需要下载的总字节数。您不需要立即读取流,您可以随时按顺序读取所有流。@CodeCaster这不是不可能的,但也不是微不足道的,而且可能无法使用WebClient完成。使用HttpClient,OP可以在开始下载之前检查响应头中每个文件的大小。这可以设置最大值。进度事件应更新单个
接收的
计数器。事实上,多个下载操作可以发布到同一个
Progress
对象,确保一次只处理一个更新事件。@PanagiotisKanavos HttpClient也利用此信息,即在显示的
DownloadProgressChanged
事件中(
e.TotalBytesToReceive
)。然而,您并不总是知道HTTP响应将有多大,例如在读取分块响应时。请参阅.Call
DownloadFileAsync()
多次。如果您的问题是“但是如何更新我的进度条”,恭喜您,您要求的是一个无法解决的问题的答案。你事先不知道这些文件会有多大,所以你必须想一个替代方案。例如,如果要下载10个文件,请让每个文件在进度条上代表10%。()@CodeCaster:你可以用HttpWebRequest而不是WebClient发送请求。这个类更复杂,提供了更多的特性。如果服务器提供内容长度,则您可以获得需要下载的总字节数。您不需要立即读取流,您可以随时按顺序读取所有流。@CodeCaster这不是不可能的,但也不是微不足道的,而且可能无法使用WebClient完成。使用HttpClient,OP可以在开始下载之前检查响应头中每个文件的大小。这可以设置最大值。进度事件应更新单个
接收的
计数器。事实上,多个下载操作可以发布到同一个
Progress
对象,确保一次只处理一个更新事件。@PanagiotisKanavos HttpClient也利用此信息,即在显示的
DownloadProgressChanged
事件中(
e.TotalBytesToReceive
)。然而,您并不总是知道HTTP响应将有多大,例如在读取分块响应时。看见