WebClient不支持并发I/O操作

fir*_*lys 20 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.
}
Run Code Online (Sandbox Code Playgroud)

Col*_*inE 19

WebClient仅支持单个操作,不能下载多个文件.你没有显示你的代码,但我的猜测是你在旧的完成之前以某种方式发出新的请求.我打赌WebClient.IsBusy当你尝试执行另一次获取时,这是正确的.

请参阅以下主题:

wb.DownloadFileAsync throw"WebClient不支持并发I/O操作." 例外


fir*_*lys 10

唯一的答案是在Completed Event范围内创建一个新的webclient.由于webclient是只读的,因此无法将其设置为新的.创建新客户端是唯一的解决方案.这允许旧客户端在后台完成.这确实会产生轻微的内存影响,因为您正在创建一个新实例而不是重用旧实例.但是如果您的示波器设置正确,垃圾收集器应该保持清洁.


Aha*_*hak 5

而不是使用WebClient,而是使用HttpClient进行并行HTTP调用。下面的代码显示了如何下载文件。

        HttpClient httpClient = new HttpClient();
        var documentList=_documentManager.GetAllDocuments();
        documentList.AsParallel().ForAll(doc =>
        {

            var responseResult= httpClient.GetAsync(doc.FileURLPath);
            using (var memStream = responseResult.Result.Content.ReadAsStreamAsync().Result)
            {
                using (var fileStream =File.Create($"{filePath}\\{doc.FileName}"))
                {
                    memStream.CopyTo(fileStream);
                }

            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一真正解决此问题的帖子。踢屁股谢谢人。+1 (2认同)