我的主线程(WPF应用程序)中有一个ListBox对象。为什么我无法在BackgroundWorker线程中访问它。据我所知,每个线程的堆栈是分开的,但堆很常见。不是在堆中创建ListBox对象。在那种情况下,为什么它无法访问。我尝试将ListBox引用作为参数传递,并尝试在BackgroundWorker中访问其内容。在线程之间共享对象的概念是否与C ++不同?
答案 0 :(得分:10)
与WinForms一样,WPF的设计通过仅从创建它们的线程访问所有用户界面元素的要求而大大简化。
当您尝试编写多线程程序时,此“功能”似乎是一个严重的限制。甚至不能直接从后台线程修改用户界面元素的最简单属性。如果是这样,我们如何在WPF中使用后台线程?
答案是我们必须将用于用户界面的操作转换为前台线程,在这里可以无冲突地执行工作。更严格地说,我们必须在创建我们试图修改的元素的线程的上下文中执行我们的操作。
WPF中的线程主题很大,但这是一篇很好的介绍性文章:
如果您阅读本文,您将了解如何在不违反线程模型的情况下使用Dispatcher
来完成您的操作。