TiffBitmapEncoder Save(Stream)保存至网络共享速度过慢问题咨询
问题分析与解决方案
直接通过TiffBitmapEncoder.Save写入网络共享路径确实是不合理的方案,建议先保存到本地临时文件,再复制到目标网络共享。
为什么直接存网络这么慢?
TiffBitmapEncoder的Save方法在编码TIFF时,会以极小的块大小向流中写入数据——每一次写入都需要经过VPN/WAN的网络往返确认。VPN本身存在较高延迟,大量小IO请求叠加后,总耗时会被放大几十甚至上百倍。
而Windows资源管理器复制文件时,系统会采用大区块批量传输策略,结合网络缓存、异步IO等优化机制,能最大程度降低延迟对传输速度的影响,因此即使在VPN环境下,复制速度也远快于编码器直接写入。
修改方案:本地暂存后复制
以下是调整后的代码示例,先将TIFF保存到本地临时文件,再复制到网络共享:
'Create Visual Brush of UIElement. Dim visualBrush As VisualBrush = New VisualBrush(source) Dim drawingVisual As DrawingVisual = New DrawingVisual Using drawingContext As DrawingContext = drawingVisual.RenderOpen 'Draw image of element. drawingContext.DrawRectangle(visualBrush, Nothing, New Rect(source.RenderSize)) End Using 'Render the image. renderTarget.Render(drawingVisual) Dim encoder As BitmapEncoder = New TiffBitmapEncoder encoder.Frames.Add(BitmapFrame.Create(renderTarget)) ' 1. 先保存到本地临时文件 Dim tempPath As String = Path.GetTempFileName() Using stream As FileStream = New FileStream(tempPath, FileMode.Create, FileAccess.Write) encoder.Save(stream) End Using Try ' 2. 复制到网络共享路径 File.Copy(tempPath, strSaveFileFullPath, overwrite:=True) Finally ' 3. 清理临时文件 If File.Exists(tempPath) Then File.Delete(tempPath) End If End Try
额外注意事项
- 临时文件使用
Path.GetTempFileName()生成,自动放入系统临时目录,避免权限问题 - 用
Try...Finally确保临时文件无论复制成功与否都会被删除,防止磁盘空间浪费 - 如果网络共享路径需要权限验证,确保应用进程拥有足够的写入权限
- 可添加复制进度监听(比如用
FileStream手动分块复制并报告进度),提升用户体验
内容的提问来源于stack exchange,提问作者so02109
相关产品推荐
相关产品推荐

