C# WebClient多文件下载程序错误
我使用以下代码从我的Web服务器下载了50多个文件C# WebClient多文件下载程序错误,c#,windows,winforms,.net-4.0,C#,Windows,Winforms,.net 4.0,我使用以下代码从我的Web服务器下载了50多个文件 private void button5_Click(object sender, EventArgs e) { WebClient client = new WebClient(); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); client.DownloadFileComp
private void button5_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
//downloads
client.DownloadFileAsync(new Uri("http://www.site.com/file/loc.file"), @"c:\app\loc ");
client.DownloadFileAsync(new Uri("http://www.site.com/file/loc.file"), @"c:\app\loc ");
client.DownloadFileAsync(new Uri("http://www.site.com/file/loc.file"), @"c:\app\loc ");
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
double bytesIn = double.Parse(e.BytesReceived.ToString());
double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
double percentage = bytesIn / totalBytes * 100;
progressBar.Value = int.Parse(Math.Truncate(percentage).ToString());
}
private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("Game Update Finished!");
}
我想下载一个文件,一次一个持续的进度条四得到了大部分的编码完成,但当我点击“下载”按钮,我得到以下错误
WebClient不支持并发I/O操作
我需要做什么?WebClient不支持每个实例的并发i/O操作(多次下载),因此您需要为每个下载创建一个单独的WebClient实例。您仍然可以异步执行每次下载并使用相同的事件处理程序。WebClient不支持每个实例的并发I/O操作(多次下载),因此您需要为每次下载创建一个单独的WebClient实例。您仍然可以异步执行每次下载并使用相同的事件处理程序。您正在使用相同的
WebClient
实例并行运行多个下载-错误告诉您不支持此操作-您可以:
- 使用多个
(每个并行下载一个) 或WebClient
- 一个接一个地下载文件
WebClient
实例并行运行多个下载-错误告诉您这不受支持-您可以:
- 使用多个
(每个并行下载一个) 或WebClient
- 一个接一个地下载文件
- 它可以以并行方式下载多个文件(每次下载一个流) 一个文件)
- 但它不能使用多个流下载一个文件
- 它可以以并行方式下载多个文件(每次下载一个流) 一个文件)
- 但它不能使用多个流下载一个文件
通过使用相同的事件处理程序,我的意思是您可以将所有实例事件汇集到一个方法中,但您必须修改逻辑以聚合数据,因为事件处理程序方法将从不同的实例调用。通过使用相同的事件处理程序,我的意思是您可以将所有实例事件汇集到一个方法中,但您必须修改逻辑以聚合数据,因为事件处理程序方法将从不同的实例调用。只需尝试写入相同的文件就意味着您尝试写入相同的文件此处的ServicePointManager@White是什么。请告诉我ServicePointManager的用法或给出完整的代码。thanks@Thomas我使用它的静态属性来限制连接计数这里的ServicePointManager@White。请告诉我ServicePointManager的用法或给出完整的代码。thanks@Thomas我使用它的静态属性来限制连接数
public partial class MainWindow : Window
{
private WebClient _webClient;
private ProgressBar[] _progressBars;
private int _index = 0;
public MainWindow()
{
InitializeComponent();
_progressBars = new [] {progressBar1, progressBar2, progressBar3, progressBar4, progressBar5};
ServicePointManager.DefaultConnectionLimit = 5;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Interlocked.Increment(ref _index);
if (_index > _progressBars.Length)
return;
_webClient = new WebClient();
_webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged;
_webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted;
_webClient.DownloadFileAsync(new Uri("http://download.thinkbroadband.com/5MB.zip"),
System.IO.Path.GetTempFileName(),
_index);
}
private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs args)
{
var index = (int) args.UserState;
_progressBars[index-1].Value = args.ProgressPercentage;
}
private void WebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs args)
{
var index = (int)args.UserState;
MessageBox.Show(args.Error == null
? string.Format("Download #{0} completed!", index)
: string.Format("Download #{0} error!\n\n{1}", index, args.Error));
}
}