如何使用WebClient通过MemoryStream保存为GIF图像且保留下载进度上报
问题原因
你当前使用的WebClient.DownloadData()是同步阻塞方法,会等到全部数据下载完成后才返回结果,执行过程中不会触发DownloadProgressChanged事件,因此无法上报下载进度。
解决方案
改用WebClient提供的异步字节下载方法DownloadDataTaskAsync(),该方法和你雷达图下载用的DownloadFileTaskAsync同属异步下载接口,会正常触发你已经绑定的所有DownloadProgressChanged事件,拿到下载完成的字节数组后再做GIF格式转存即可,完全满足你的需求。
修改后的卫星图像下载代码
else { // 异步下载字节数据,全程触发进度上报事件 byte[] imageBytes = await client.DownloadDataTaskAsync(new Uri(urls[i])); using (MemoryStream ms = new MemoryStream(imageBytes)) { Image img = Image.FromStream(ms, true); img.Save(satelliteFolderImagesDownload + "\\image" + satCounter + ".gif", System.Drawing.Imaging.ImageFormat.Gif); } satCounter++; }
修改后原有进度条、下载速度、完成状态的逻辑都不需要改动,即可同时实现进度上报和GIF格式转存的功能。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

