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是只读的,因此无法将其设置为新的.创建新客户端是唯一的解决方案.这允许旧客户端在后台完成.这确实会产生轻微的内存影响,因为您正在创建一个新实例而不是重用旧实例.但是如果您的示波器设置正确,垃圾收集器应该保持清洁.
而不是使用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)
归档时间: |
|
查看次数: |
24794 次 |
最近记录: |