Я работаю над C# WPF-приложением, которое загружает много изображений и отображает его как миниатюры. Я бы хотел сделать это многопоточным способом. Поэтому я попытался реализовать BackgroundWorker.Загрузка изображений asynchronous в C#
Код DoWork в BackgroundWorker (в):
string[] files = e.Argument as string[];
foreach (string file in files)
{
ImageModel image = new ImageModel();
image.FilePath = file;
_importWorker.ReportProgress(1, image);
_imageCollectionVM.Images.Add(image); // also tried this one in ReportProgress()
}
В моем XAML коде привязки к свойству BitmapImage из ImageModel. (AsyncState = True не помогает.) Здесь я получаю эту ошибку: «DependencySource» и «DependencyObject» должны быть в одном потоке.
<Image Source="{Binding BitmapImage}" />
Если я прокомментирую это, изображение, кажется, импортировано, но я не могу получить к нему доступ, например. выбрав его в ListView. В своем SelectionChanged он говорит тогда, что этот объект обладает другим потоком.
Как решить эти проблемы? Заранее спасибо!
Я полагаю, что мне нужно использовать метод 'BeginInvoke'' this.Dispatcher', правильно? На самом деле, у меня уже есть ObservableCollection, к которому я привязываю источник элементов ListView (обновленный оригинальный пост). Но если я делаю 'imageCollectionVM.Images.Add (изображение);' внутри Action, я получаю сообщение об ошибке «DependencySource и DependencyObject должно быть в одном потоке». – Sentropie
Если вы пытаетесь использовать ObservableCollection, см. Последнюю ссылку, которую я опубликовал в своем ответе, у нее есть BindingList <>, который может быть обновлен из фонового потока. –