C# 使用Async保存文件流
我正试图将文件(BitmapImage)保存到某个位置,但使用C# 使用Async保存文件流,c#,wpf,async-await,C#,Wpf,Async Await,我正试图将文件(BitmapImage)保存到某个位置,但使用async&wait时,我收到一个错误,表示该文件正在使用中: 进程无法访问文件“C:\Users\\图1.jpg“因为 它正在被另一个进程使用 我的编码: BitmapImage image = new BitmapImage(new Uri(oldImagePath)); var encoder = new JpegBitmapEncoder() { QualityLevel = 17 }; encoder.Frames.Add(
async
&wait
时,我收到一个错误,表示该文件正在使用中:
进程无法访问文件“C:\Users\\图1.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
当我在不使用wait的情况下使用代码时,代码工作得非常好。我想这可能是因为另一个线程可能正在使用它,但有人可以帮助我或向我解释解决我的问题的方法吗?谢谢。在您将
任务
与等待
一起使用时,另一个线程将用于保存您的编码器
。但是您的编码器也被主线程使用,所以新线程不能使用它
稍微更改一下代码:
await Task.Run(() =>
{
using (var filestream = new FileStream(GetImageLocation(), FileMode.Create))
{
BitmapImage image = new BitmapImage(new Uri(oldImagePath));
var encoder = new JpegBitmapEncoder() { QualityLevel = 17 };
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(filestream);
}
}
现在您在同一个任务中创建并保存
编码器,它将只使用一个线程。我认为您应该将代码移动到任务中。运行,因为它会在另一个线程中调用。您可以编码到内存流,获取字节数组,在FileStream
上使用WriteAsync
,避免使用任务。同时运行
BitmapImage image = new BitmapImage(new Uri(oldImagePath));
var encoder = new JpegBitmapEncoder() { QualityLevel = 17 };
encoder.Frames.Add(BitmapFrame.Create(image));
using (var mem = new MemoryStream())
using (var filestream = new FileStream(GetImageLocation(), FileMode.Create))
{
encoder.Save(mem);
var data = mem.ToArray();
await filestream.WriteAsync(date, 0, data.Length);
}
请注意,这将在编码过程中阻塞线程,并将使用更多内存。这将提供什么功能,Roma的答案不是这样的?我们在同一时刻回答了为什么不把它全部转移到任务中。运行call?你可以编码到内存流,得到字节数组,然后在文件流上使用WriteAsync
,避免使用任务。一起运行。@juharr听起来很有趣,我会尝试一下,谢谢。@juharr您也可以将您的解决方案作为其他可能需要它的人的替代解决方案发布吗?我也可以将其与当前选择的答案一样使用,我的图像加载变慢,并且我的图像
控件在图像加载之前加载,因此没有图像显示…(这也是因为不同的线程在执行该工作)。在CPU限制的编码过程中,您的线程将被阻塞,但这应该比IO要短得多。你也可以考虑不使用<代码>等待<代码>,这取决于这个代码在哪里运行(如果在UI线程中,那么你希望保持它,以避免在保存过程中锁定UI)。