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

Dea*_*uga 2 .net wpf thread-safety

WPF4释放的 Adam Nathan中说:

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

专业WPF编程声称相反:

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

DispatcherObject上的MSDN:

只有创建Dispatcher的线程才可以直接访问DispatcherObject.要从创建DispatcherObject的线程以外的线程访问DispatcherObject,请在与DispatcherObject关联的Dispatcher上调用Invoke或BeginInvoke.

基于MSDN描述看起来像WPF4 Unleashed引用是一个错字或Nathan是错的,专业WPF编程作者是对的...

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

编辑:

MSDN还声明:

需要强制执行线程安全的DispatcherObject子类可以通过对所有公共方法调用VerifyAccess来实现.这可以保证调用线程是创建DispatcherObject的线程.

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

Jon*_*eet 5

取决于您对线程安全的意思,但我赞成WPF4 Unleashed的视图 - 基于MSDN描述.

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

在另一方面,你可以考虑,如果DispatcherObject正确使用,代码的类没有采取线程安全考虑,因为它应该只由一个线程调用.

所以在某种意义上说它是"从外部线程不安全,从内部线程安全".我更喜欢使用更具描述性的术语:类具有线程亲和性.

  • @kzen:"Eric的优秀帖子"几乎是一个重言式;) (2认同)