我从网页中提取JSON字符串,其中包含对象列表。在每个对象中有两个字符串,它们都包含指向图像的链接。我想在本地下载此图片。
我目前正在使用每隔几秒触发一次的异步功能,并查找JSON中以前没有在列表中的任何新对象,获取图像链接,并像这样下载它们:
using (WebClient webClient = new WebClient())
{
await webClient.DownloadFileTaskAsync(new Uri(object.AvatarImage), System.IO.Directory.GetCurrentDirectory() + "\\Elements" + "\\" + object.PostID.Replace(':', '-') + "_avatar.png");
}
using (WebClient webClient = new WebClient())
{
await webClient.DownloadFileTaskAsync(new Uri(object.Media), System.IO.Directory.GetCurrentDirectory() + "\\Elements" + "\\" + object.PostID.Replace(':', '-') + "_media.png");
}
这样可以正常工作,直到我收到大量图片,此时我有时会收到错误:
该过程无法访问文件' 路径'因为它正被另一个进程使用。
我没有在其他任何地方操作文件,虽然图像路径确实绑定到图像控件,但如果我破坏绑定,我仍会得到相同的错误。
导致这种情况的原因是什么?
答案 0 :(得分:1)
您是否使用System.Timers.Timer触发下载? 您是否将计时器设置为AutoReset = true? 然后可能在第一次调用完成之前第二次调用下载方法。
来自https://msdn.microsoft.com/en-us/library/system.timers.timer.autoreset(v=vs.110).aspx
"如果SynchronizingObject属性为null,则在ThreadPool线程上引发Elapsed事件。如果Elapsed事件的处理持续时间超过Interval,则可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。"
一种解决方案是将AutoReset设置为false,并在下载完成后始终调用计时器Start()方法。执行足够的错误处理非常重要,以便未处理的异常不会阻止调用Start()方法。