血清:
別のスレッドでも追加した後、それを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできませんDispatcher.Invoke
。
問題はさらに追加した後に無傷のままですDispatcher.Invoke
。
async Task capturePredict()
{
await Dispatcher.Invoke( async () =>
{
PngBitmapEncoder image = new PngBitmapEncoder();
image.Frames.Add(BitmapFrame.Create(bitmap));
using (Stream stream = File.Create(@"E:\ImageClassificationTraining\image.png"))
{
await Task.Run(() => image.Save(stream));
}
});
}
クレメンス:
(これは、クロススレッドアクセスを行うために凍結することができる)たBitmapSourceを復号化とは対照的に、一見UIスレッド以外のスレッドで行うことができないコードします。
ただし、このようなもので、ファイルの書き込みからの符号化ステップを分離することができます。
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);
}
}
}