访问在子线程中实例化的字典项

时间:2012-02-12 01:00:47

标签: c# wpf multithreading

我目前正在努力解决线程,并希望有人能够清楚地解释如何解决以下错误。

我有一个全局Dictionary<string, BitmapImage> dic,我在主线程中实例化。

主线程创建一个子线程,用图像填充字典。

主线程然后尝试访问字典并抛出异常

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

我没有问题访问字典本身,例如dic.ContainsKey("key")工作得很好,就在我尝试访问字典中发现错误的BitmapImage时。

我猜这是因为存储在字典中的BitmapImages在子线程中被实例化并且它引起了一个问题 - 任何想法如何解决这个问题?

我已经看过大量的线程教程和建议,但似乎其他地方告诉你如何从子线程访问父线程对象,而我正试图做相反的事情。

感谢。

1 个答案:

答案 0 :(得分:8)

通常,您只能从创建它们的线程中访问UI元素。这意味着,您应该确保主线程本身正在创建BitmapImage个对象。

但是,在这种情况下,您可能会使用这样一个事实:BitmapImage可以在冻结后使用Freeze()方法从不同的线程中使用。因此,您可以尝试在子线程上创建图像,冻结它们,然后将它们添加到您的字典中(确保以线程安全的方式执行,例如通过在访问字典之前锁定一些互斥对象)。

可以在Freezeable Objects Overview网站上找到更多信息。