いくつかの画像を非同期でUIにロードしようとしています。
画像が読み込まれるとき(パスからビットマップが作成されるとき)、画像はウィンドウ上の長方形の塗りつぶしとして設定する必要があります。
ビットマップイメージの作成をDispatcher.Invokeメソッドにも入れると、コードは機能します。しかし、明らかに私は、呼び出しではなく、トレッドで重い作業(ビットマップの作成)を実行したいと思っています。
私はbackgroundworkerを含むいくつかの解決策を試しましたが、それを機能させることができません。現在、次のコードがあります。
private void Window_ContentRendered(object sender, EventArgs e)
{
Thread loadThread = new Thread(new ThreadStart(LoadImagesAsync));
loadThread.Start();
}
private void LoadImagesAsync()
{
IEnumerable<string> images = System.IO.Directory.GetFiles(IMAGE_FOLDER, "*.jpg").Skip(_PageNumber * NUMBER_OF_IMAGES).Take(NUMBER_OF_IMAGES);
for (int i = 0; i < NUMBER_OF_IMAGES; i++)
{
var bitm = new BitmapImage(new Uri(images.ElementAt(i)));
this.Dispatcher.Invoke(() =>
{
Grid grid = (Grid)grd_photoBox.Children[i];
var rectangle = (from e in grid.Children.OfType<Rectangle>()
where e is Rectangle
select e).First();
ImageBrush brush = new ImageBrush(bitm);
rectangle.Fill = brush;
});
}
}
次の例外が発生します。
The calling thread cannot access this object because a different thread owns it.
手がかりはありますか?