VB.NET使用WebClient下载图片后向ListControl赋值出现加载失败问题
问题核心原因
- 最初使用
DownloadFileAsync为异步下载方法,触发下载后不会等待文件下载完成就直接执行后续读取图片的逻辑,绝大部分文件还没写入本地完成就被访问,自然加载失败。 Image.FromFile会持续占用目标文件的句柄直到Image对象被显式释放,160张高清原图直接加载进内存很容易触发内存溢出,同时文件被锁也可能导致后续的下载任务写入失败。- 你修改后的代码只下载了第一行的封面图片,剩下159行的图片根本没有下载,自然无法加载。
正确实现方案
你可以选择下载单张立即处理单张的逻辑,既可以保证下载完成再读取,也能避免一次性加载过多文件,以下代码需提前引入System.IO和System.Drawing命名空间:
Dim downloadPath As String = "C:\App_Uploads\" ' 先确保下载目录存在,避免写入报错 If Not Directory.Exists(downloadPath) Then Directory.CreateDirectory(downloadPath) End If For Each row As DataRow In transferstable.Rows Dim coverName As String = row.Item("cover").ToString() Dim localFilePath As String = Path.Combine(downloadPath, coverName) ' 先判断文件是否已存在,避免重复下载 If Not File.Exists(localFilePath) Then Using client As New WebClient() Dim url As String = "https://domain.org/images/covers/" & coverName ' 用同步下载保证文件写入完成再执行后续逻辑,如需异步可搭配Await等待任务完成 client.DownloadFile(New Uri(url), localFilePath) End Using End If ' 加载图片时生成适配列表尺寸的缩略图再绑定,大幅降低内存占用 Using originalImg As Image = Image.FromFile(localFilePath) ' 可根据你的ListControl实际需要调整缩略图宽高参数 Dim thumbImg As New Bitmap(originalImg, New Size(200, 300)) ListControl1.Add("somename", "item title", "description", "sideinfo", thumbImg, 1) End Using Next
可选优化点
- 如果你的ListControl支持虚拟模式,优先用虚拟模式加载,只渲染可视区域的图片,内存占用会降低90%以上
- 可以给下载逻辑加超时和异常捕获,避免个别图片下载失败导致整个流程中断
- 如果要保留批量异步下载,需要等待所有下载任务全部完成后再执行加载图片的逻辑,不要触发下载后立刻读取
内容的提问来源于stack exchange,提问作者WiiLF
相关产品推荐
相关产品推荐

