Доступ к элементам словаря, созданным в дочернем потоке - PullRequest
5 голосов
/ 12 февраля 2012

В настоящее время я работаю с потоками и надеюсь, что кто-то может четко объяснить, как устранить следующую ошибку.

У меня есть глобальный Dictionary<string, BitmapImage> dic, который я создаю в основном потоке.

Основной поток создает дочерний поток для заполнения словаря изображениями.

Затем основной поток пытается получить доступ к словарю и выдает исключение

The calling thread cannot access this object because a different thread owns it

Iнет проблем с доступом к самому словарю, например, dic.ContainsKey("key") работает просто отлично, только когда я пытаюсь получить доступ к BitmapImage в словаре, возникает ошибка.

Я предполагаю, что это потому, что BitmapImages хранятся всловарь создается в дочернем потоке, и это вызывает проблему - есть идеи, как мне обойти это?

Я посмотрел здесь множество учебников и советов по многопоточности, но кажется, что везде другие расскажут вам, какполучить доступ к объекту родительского потока из дочернего потока, тогда как я пытаюсь сделать наоборот.

Спасибо.

1 Ответ

8 голосов
/ 12 февраля 2012

В общем, вы можете получить доступ к элементам пользовательского интерфейса только из потока, в котором они были созданы.Это означает, что вы должны убедиться, что основной поток сам создает объекты BitmapImage.

Однако в этом случае вы можете использовать тот факт, что BitmapImage можно использовать из разных потоков после их замораживания (с помощью метода Freeze () ).Поэтому вы можете попытаться создать изображения в дочерних потоках, заморозить их и затем добавить их в свой словарь (убедитесь, что вы делаете это безопасным для потоков способом, например, заблокировав некоторый объект мьютекса перед доступом к словарю).информация может быть найдена на Freezeable Objects Overview site.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...