在 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 声明毕竟是准确的......
答案 0 :(得分:5)
它depends what you mean by thread-safe,但我赞成WPF4 Unleashed的观点 - 基于MSDN描述。
文档说您只能 访问特定线程上DispatcherObject
的成员 - 因此从任意线程使用它是不安全的。这对我来说听起来像是一个线程不安全的类型。
另一方面,可能认为如果正确使用DispatcherObject
,则内的代码不必采用线程安全考虑到,因为它应该只从一个线程调用。
因此在某种意义上说,它是“来自外部的线程不安全,从内部线程安全”。我更喜欢使用更具描述性的术语:类具有线程关联性。