2011-05-30 98 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來完成你的而不違反線程模型。