You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET使用WebClient下载图片后向ListControl赋值出现加载失败问题

问题核心原因

  1. 最初使用DownloadFileAsync为异步下载方法,触发下载后不会等待文件下载完成就直接执行后续读取图片的逻辑,绝大部分文件还没写入本地完成就被访问,自然加载失败。
  2. Image.FromFile会持续占用目标文件的句柄直到Image对象被显式释放,160张高清原图直接加载进内存很容易触发内存溢出,同时文件被锁也可能导致后续的下载任务写入失败。
  3. 你修改后的代码只下载了第一行的封面图片,剩下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:18:03