2012-01-19 154 views
2

WPF4偷跑亞當森說:從DispatcherObject繼承的類是線程安全的還是線程不安全的?

大多數WPF類自DispatcherObject派生的,因此本質上 線程不安全

專業WPF編程聲稱相反:

DispatcherObject的是在架構層次, 的最低水平類,因爲幾乎所有的對象繼承它,大多數對象是 固有thread- safe

DispatcherObject上的MSDN:

只有分派器創建的線程可以直接訪問 DispatcherObject。爲了從線程 以外創建DispatcherObject的線程中訪問DispatcherObject,調用Invoke 或調度程序上的BeginInvoke,DispatcherObject與 相關聯。

根據MSDN的描述,它看起來像WPF4偷跑報價要麼是一個錯字或彌敦道是不對的和專業WPF編程作者是正確的......

反正是類繼承DispatcherObject本質上是線程安全的還是固有線程不安全的?

編輯:

MSDN還指出:

需要通過調用VerifyAccess上所有公共方法執行線程安全可以 這樣做DispatcherObject的子類。這保證了 的調用線程是DispatcherObject創建的線程 。

這間接證實了WPF4偷跑要求準確畢竟...

+0

取決於* thread-safe *的定義。 –

回答

5

depends what you mean by thread-safe,但我贊成WPF4偷跑的觀點 - 基於MSDN的描述。

該文檔說您可以只有在特定線程上訪問DispatcherObject的成員 - 因此從任意線程使用它是不安全的。這聽起來像對我來說是一個線程不安全的類型。

在另一方面,你可以考慮如果一個DispatcherObject被正確使用,內代碼類沒有采取線程安全考慮,因爲它應該只從一個單獨的線程中調用。

因此,從某種意義上說,它是「從外部線程不安全,內部線程安全的」。我寧願使用更具描述性的術語:這些類具有線程親和力

+0

但是,如果「只有創建分派器的線程可以直接訪問DispatcherObject」,是不是因爲它不能從線程以外的線程訪問Dispatcher,UI線程是有效的? –

+0

@kzen:從任何其他線程都無法正確*訪問它,但是沒有什麼可以阻止您嘗試在代碼中執行它。如果你是幸運的或者工作的話,它會在執行時間爆炸*如果你不工作,有些時候*。這就像是說'IDisposable'的實現本質上是資源安全的:它們是,如果你正確使用它們,但你仍然必須把工作放在確保你處理它們... –

+0

優秀的發佈由埃裏克,謝謝對於鏈接...線程是太好玩了:) –

相關問題