使用Async保存FileStream

Car*_*r22 3 c# wpf async-await

我试图将文件(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
Run Code Online (Sandbox Code Playgroud)

当我使用的代码没有await,代码工作完全正常.我想这可能是因为另一个线程可能正在使用它,但任何人都可以帮助或向我解释我的问题吗?谢谢.

Rom*_*och 6

在当您使用情况Taskawait另一个线程来保存encoder.但是您的主编码也会使用您的编码器,因此新线程无法使用它.

稍微改变你的代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您encoder在同一个任务中创建并保存它,它将只使用一个线程.

  • 为什么不把它全部移入Task.Run调用? (3认同)