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

Gav*_*oss 5 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在子线程中被实例化并且它引起了一个问题 - 任何想法如何解决这个问题?

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

谢谢.

Mar*_*uła 8

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

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

有关详细信息,请访问Freezeable Objects Overview网站.