Я пытаюсь загрузить несколько изображений async в ui.Создание и обновление элементов пользовательского интерфейса Async Wpf
Когда изображение загружается (растровое изображение создается из пути), изображение должно быть задано как заполнение прямоугольника в окне.
Когда я помещал создание bitmapimage также в метод Dispatcher.Invoke, код работает. Но, очевидно, мне нужна тяжелая работа (создание растрового изображения), выполненная в протекторе, а не в вызове.
Я пробовал несколько решений, включая фонаря, но я не могу заставить его работать. Сейчас у меня есть следующий код:
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.
Любые улики?
Можете ли вы описать, как это «не работает», когда вы кладете создание Bitmap вне Invoke? – Kohanz
Исправлено недопустимое исключение операции, я отредактировал свой вопрос – middelpat
Предлагаю взглянуть на это: http://stackoverflow.com/questions/1924408/invalid-cross-thread-access-issue – Kohanz