2011-05-30 106 views
5

我的主线程(WPF应用程序)中有一个ListBox对象。为什么我无法在BackgroundWorker线程中访问它。据我所知,堆栈对于每个线程都是分开的,但是堆是常见的。不是在堆中创建ListBox对象。在那种情况下,它为什么不能访问。我尝试传递ListBox引用作为参数,并试图访问BackgroundWorker中的内容。在不同于C++的线程之间共享对象的概念是什么?在BackgroundWorker和主线程之间共享对象

+0

可以请你展示一些代码片段吗? – crypted 2011-05-30 03:21:48

+1

您可以将它作为任何其他对象传递,但只要您更改它,由于线程模型为“STA”,将会引发异常。你可以在'stackoverflow'找到如何从不同的线程安全地改变它。 – Xaqron 2011-05-30 03:32:45

回答

10

与WinForms一样,WPF的设计大大简化了所有用户界面元素只能由创建它们的线程访问的要求。

当您尝试编写多线程程序时,此“功能”似乎是一个严重的限制。直接从后台线程修改用户界面元素的最简单属性是不可能的。如果是这样,我们如何使用WPF使用后台线程?

答案是,我们必须将用于用户界面我们的行动到前台线程那里的工作可以在不冲突进行。更严格地说,我们必须在创建我们要修改的元素的线程上下文中执行我们的动作。

线程的WPF主题是一个大的,但这里是一个很好的介绍性文章:

如果你阅读这篇文章,你看如何使用Dispatcher来完成你的而不违反线程模型。