Вот моя проблема.
Я загружаю несколько изображений BitmapImage в BlockingCollection.
public void blockingProducer(BitmapImage imgBSource)
{
if (!collection.IsAddingCompleted)
collection.Add(imgBSource);
}
загрузка происходит в фоновом потоке.
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
String filepath; int imgCount = 0;
for (int i = 1; i < 10; i++)
{
imgCount++;
filepath = "Snap";
filepath += imgCount;
filepath += ".bmp";
this.Dispatcher.BeginInvoke(new Action(() =>
{
label1.Content = "Snap" + imgCount + " loaded.";
}), DispatcherPriority.Normal);
BitmapImage imgSource = new BitmapImage();
imgSource.BeginInit();
imgSource.UriSource = new Uri(filepath, UriKind.Relative);
imgSource.CacheOption = BitmapCacheOption.OnLoad;
imgSource.EndInit();
blockingProducer(imgSource);
}
}
при отладке этой части кода все выглядит нормально, теперь возникает проблема...
после завершения загрузки изображений я хочу показать их в пользовательском интерфейсе одно за другим. Для этого я использую диспетчер, но всегда получаю сообщение о том, что вызываемый поток не может получить доступ к объекту, поскольку он принадлежит другому потоку.
public void display(BlockingCollection<BitmapImage> results)
{
foreach (BitmapImage item in collection.GetConsumingEnumerable())
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
this.dstSource.Source = item;
Thread.Sleep(250);
}), DispatcherPriority.Background);
}
}
отладка обвиняет, что ошибка здесь
this.dstSource.Source = item;
Я пробую все, но не могу понять, что не так. У кого-нибудь есть идеи?