我目前正在努力解决线程,并希望有人能够清楚地解释如何解决以下错误。
我有一个全局Dictionary<string, BitmapImage> dic
,我在主线程中实例化。
主线程创建一个子线程,用图像填充字典。
主线程然后尝试访问字典并抛出异常
The calling thread cannot access this object because a different thread owns it
我没有问题访问字典本身,例如dic.ContainsKey("key")
工作得很好,就在我尝试访问字典中发现错误的BitmapImage
时。
我猜这是因为存储在字典中的BitmapImages在子线程中被实例化并且它引起了一个问题 - 任何想法如何解决这个问题?
我已经看过大量的线程教程和建议,但似乎其他地方告诉你如何从子线程访问父线程对象,而我正试图做相反的事情。
感谢。
答案 0 :(得分:8)
通常,您只能从创建它们的线程中访问UI元素。这意味着,您应该确保主线程本身正在创建BitmapImage
个对象。
但是,在这种情况下,您可能会使用这样一个事实:BitmapImage
可以在冻结后使用Freeze()方法从不同的线程中使用。因此,您可以尝试在子线程上创建图像,冻结它们,然后将它们添加到您的字典中(确保以线程安全的方式执行,例如通过在访问字典之前锁定一些互斥对象)。
可以在Freezeable Objects Overview网站上找到更多信息。