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

标签 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 在子线程中被实例化并且它导致了一个问题 - 我有什么想法可以解决这个问题吗?

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

谢谢。

最佳答案

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

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

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

关于c# - 访问在子线程中实例化的字典项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245523/

相关文章:

c# - 获取被点击的菜单项的文本?

java - 为什么会有人使用 Java Thread 无参数构造函数?

c# - 单核多线程控制台应用程序

c# - 哪个是 delphi "class of "(类的类型)的 C# 声明?

c# - 如何将用户输入的字符串与任何表示本地主机的内容匹配?

c# - 如何将作为参数传递的 KeyValuePair 转换为 Command_Executed?

c# - 我怎样才能更快地运行这个 Entity Framework 示例

c# - 无法将列 int 设置为 null。请在数据行中使用 dbnull 代替

c# - gridview 中的数据源变为 null

wpf - Prism 是纯mvvm平台吗?