WPF/バックグラウンドワーカーとBitMapsourceの問題
-
22-09-2019 - |
質問
私はWPFの初心者であり、テクノロジーに精通するためにホームプロジェクトを試みています。ユーザーが画像ファイルを選択する単純なフォームがあり、その後、画像のサムネイルとともにEXIFデータを表示します。これは正常に動作していますが、RAW画像ファイル(〜9 MB)を選択すると、親指が負荷をかけている間にわずかな遅延が発生する可能性があるため、バックグラウンドワーカーを使用して画像をデコードでき、ユーザーはExifデータを表示できると思いました。画像がデコードされると表示されます。
Bitmapsourceオブジェクトは、バックグラウンドワーカーDoworkメソッドで宣言されています。
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
string filePath = args.Argument as string;
BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapSource bmpSource = bmpDecoder.Frames[0];
bmpSource.Freeze(); //As suggested by Paul Betts
args.Result = bmpSource;
};
私が遭遇している問題は、Objectが別のスレッドで所有されているため、RunWorkErcompletedメソッドで画像制御のソースを設定しようとするときです。
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
imgThumb.Source = args.Result as BitmapSource;
};
を使用してみました imgThumb.Dispatcher.BeginInvoke()
ソースを設定する方法もこれも機能しませんでした。 args.Result
それは別のスレッドが所有しており、 imgThumb
?どうすればこれを回避できますか?
ディスパッチャーを間違えてコーディングしていた可能性があります(以下はメモリからのもので、自分が持っていたものを削除しました)。
imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
delegate(BitmapSource src)
{
imgThumb.Source = src;
}
), bmpSource);
どんな提案やアイデアは大歓迎です。
アップデート
Doworkメソッドを変更してBitMapCreateOptions.NONE.NONE.DELAYCREATIONではなく使用しましたが、RAWファイル(Canon .Cr2ファイルがこれまでテストしたすべて)をロードするときに次のエラーが発生します。コードはJPGで正常に機能します。これは、生ファイルを表示できるようにインストールしたCanon Codecの問題になる可能性がありますか?
アプリケーションは、別のスレッドに対してマーシャルされたインターフェイスと呼ばれます。 (hresultからの例外:0x8001010E(rpc_e_wrong_thread))
解決
BitmapsourceでFreeze()を呼び出すと、この問題はありません(フリーズはスレッド制限を取り除きますが、オブジェクトを不変にします)
他のヒント