В отличие от декодирования BitmapSource (который может быть заморожен, чтобы сделать его доступным для нескольких потоков), кодирование, по-видимому, не может выполняться в потоке, отличном от потока пользовательского интерфейса.
Однако вы можете отделить кодировку шаг от записи файла, примерно так:
public async Task SaveImageAsync(BitmapSource bitmap, string path)
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var memoryStream = new MemoryStream())
{
encoder.Save(memoryStream);
memoryStream.Position = 0;
using (var fileStream = File.Create(path))
{
await memoryStream.CopyToAsync(fileStream);
}
}
}