【发布时间】:2017-12-03 02:11:54
【问题描述】:
我正在尝试将文件 (BitmapImage) 保存到某个位置,但一旦我使用 async 和 await,我就会收到一条错误消息,提示该文件正在使用中:
进程无法访问文件'C:\Users\ ... \image1.jpg',因为 它正被另一个进程使用。
我的编码:
BitmapImage image = new BitmapImage(new Uri(oldImagePath));
var encoder = new JpegBitmapEncoder() { QualityLevel = 17 };
encoder.Frames.Add(BitmapFrame.Create(image));
using (var filestream = new FileStream(GetImageLocation(), FileMode.Create))
await Task.Run(() => encoder.Save(filestream)); //Error here
当我使用代码没有await 时,代码工作得非常好。我认为这可能是因为另一个线程可能正在使用它,但是任何人都可以帮助或向我解释解决我的问题的方法吗?谢谢。
【问题讨论】:
-
您可以编码到内存流获取字节数组,然后在
FileStream上使用WriteAsync,并完全避免使用Task.Run。 -
@juharr 听起来很有趣,我会尝试一下,谢谢。
-
@juharr 您还可以将您的解决方案发布为可能需要它的其他人的替代解决方案吗?我也可以将它与当前选择的答案一起使用,我的图像加载速度很慢,我的
Image控件在图像之前加载,所以没有图像显示......(也是因为不同的线程在做这项工作)。 -
你的线程在CPU绑定的编码过程中会被阻塞,但这应该比IO少得多。您甚至可以考虑不使用
await,具体取决于此代码的运行位置(如果在 UI 线程中,那么您希望保留它以避免在保存期间锁定 UI)。
标签: c# wpf async-await