WebClient不支持并发I / O操作

时间:2012-03-19 04:39:54

标签: c# silverlight windows-phone-7

如何从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.
}

4 个答案:

答案 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(); 
}