如何从DownloadStringCompleted事件中获取此错误?这是不是意味着,它已经完成了?还有其他事件可以解决这个问题吗?
我很少得到这个错误,但偶尔会发生在我的WP7手机上。我有一个Web客户端,我一遍又一遍地开火,然后我从已完成的事件中重新开火。这是否正在发生,因为仍然存在一些陈旧的连接?有没有办法防止这种100%?
我已经检查了线程是否有机会自己走过去,但它只是在已完成的事件中被触发。
我怎么能确定,当整个事件被触发时,客户端不再是isBusy?一个建议是在客户端忙的时候添加一段线程休眠。
一些伪代码。
var client = new WebClient("URL 1");
client.CompletedEvent += CompletedEvent;
client.downloadasync();
void CompletedEvent(){
Dosomestuff;
client.downloadasync(); //This is where we break.
}
答案 0 :(得分:17)
WebClient仅支持单个操作,无法下载多个文件。你没有显示你的代码,但我的猜测是你在旧的完成之前以某种方式发出新的请求。我敢打赌,当您尝试执行另一次提取时WebClient.IsBusy
为真。
请参阅以下主题:
wb.DownloadFileAsync throw "WebClient does not support concurrent I/O operations." exception
答案 1 :(得分:10)
唯一的答案是在Completed Event范围内创建一个新的webclient。由于webclient是只读的,因此无法将其设置为新的。创建新客户端是唯一的解决方案。这允许旧客户端在后台完成。这确实会产生轻微的内存影响,因为您正在创建一个新实例而不是重用旧实例。但是如果您的示波器设置正确,垃圾收集器应该保持清洁。
答案 2 :(得分:5)
而不是使用WebClient使用HttpClient进行并行HTTP调用。下面的代码显示了如何下载文件。
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass;
private final double radius;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
}
答案 3 :(得分:0)
解决方案,我发现是使用多个WebClient对象,所以要修改你的伪代码示例;尝试
var client = new WebClient("URL 1");
client.CompletedEvent += CompletedEvent;
client.downloadasync();
void CompletedEvent(){
Dosomestuff;
var client2 = new WebClient();
client2.downloadasync();
}