继承自DispatcherObject的类是线程安全的还是线程不安全的?

时间:2012-01-19 20:42:19

标签: .net wpf thread-safety

WPF4 Unleashed 中,Adam Nathan表示:

  

大多数WPF类派生自DispatcherObject,因此   本质上线程不安全

专业WPF编程声称相反:

  

DispatcherObject是框架层次结构中的最低级别类,   并且因为几乎所有对象都从它继承,所以大多数对象都是   本质上线程安全

DispatcherObject上的MSDN:

  

只有创建Dispatcher的线程才能访问   DispatcherObject直接。从线程访问DispatcherObject   除了创建DispatcherObject的线程之外,调用Invoke   在Dispatcher上的BeginInvoke或DispatcherObject是关联的   用。

根据MSDN描述看起来像 WPF4 Unleashed 引用是拼写错误或Nathan只是错误而专业WPF编程作者是对的...

无论如何,继承自DispatcherObject的类本身就是线程安全的还是固有的线程不安全的?

编辑:

MSDN还声明:

  

需要强制执行线程安全的DispatcherObject的子类可以   通过在所有公共方法上调用VerifyAccess来执行此操作。这保证了   调用线程是DispatcherObject创建的线程   上。

这间接证实 WPF4 Unleashed 声明毕竟是准确的......

1 个答案:

答案 0 :(得分:5)

depends what you mean by thread-safe,但我赞成WPF4 Unleashed的观点 - 基于MSDN描述。

文档说您只能 访问特定线程上DispatcherObject的成员 - 因此从任意线程使用它是不安全的。这对我来说听起来像是一个线程不安全的类型。

另一方面,可能认为如果正确使用DispatcherObject,则内的代码不必采用线程安全考虑到,因为它应该只从一个线程调用。

因此在某种意义上说,它是“来自外部的线程不安全,从内部线程安全”。我更喜欢使用更具描述性的术语:类具有线程关联性