WebClient不支持并发I / O操作

如何从DownloadStringCompleted事件中获取此错误? 这不意味着,它已经完成了吗? 还有其他事件可以解决这个问题吗?

我很少得到这个错误,但偶尔它会在我的WP7手机上发生。 我有一个我一遍又一遍地开火的网络客户端,然后我从已完成的事件中重新开火。 这是否正在发生,因为仍有一些陈旧的连接打开? 有没有办法防止这种100%?

我已经检查过线程是否有机会自己走过,但它只是在已完成的事件中触发。

我怎么能确定,当整个事件被解雇时,客户端不再是isBusy? 一个建议是在客户端忙的时候添加一段线程hibernate。

一些伪代码。

var client = new WebClient("URL 1"); client.CompletedEvent += CompletedEvent; client.downloadasync(); void CompletedEvent(){ Dosomestuff; client.downloadasync(); //This is where we break. } 

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

请参阅以下主题:

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

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

而不是使用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); } } }); 

我找到的解决方案是使用多个WebClient对象,以便修改你的伪代码示例; 尝试

 var client = new WebClient("URL 1"); client.CompletedEvent += CompletedEvent; client.downloadasync(); void CompletedEvent(){ Dosomestuff; var client2 = new WebClient(); client2.downloadasync(); }