.net 从DispatcherObject继承的类是线程安全的还是线程不安全的?

.net 从DispatcherObject继承的类是线程安全的还是线程不安全的?,.net,wpf,thread-safety,.net,Wpf,Thread Safety,在WPF4释放的中,Adam Nathan表示: 大多数WPF类派生自DispatcherObject,因此 固有的线程不安全 专业WPF编程主张相反: DispatcherObject是框架层次结构中的最低级别类, 因为几乎所有对象都是从它继承的,所以大多数对象都是 本质上是线程安全的 DispatcherObject上的MSDN: 只有在其上创建调度程序的线程可以访问 直接调度对象。从线程访问DispatcherObject的步骤 除了创建DispatcherObject的线程之外,调用In

WPF4释放的中,Adam Nathan表示:

大多数WPF类派生自DispatcherObject,因此 固有的线程不安全

专业WPF编程主张相反:

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

DispatcherObject上的MSDN:

只有在其上创建调度程序的线程可以访问 直接调度对象。从线程访问DispatcherObject的步骤 除了创建DispatcherObject的线程之外,调用Invoke 或在与DispatcherObject关联的Dispatcher上启动 有

根据MSDN的描述,似乎WPF4释放的报价要么是打字错误,要么是Nathan错了,专业WPF编程的作者是对的

无论如何,从DispatcherObject继承的类是天生线程安全的还是天生线程不安全的

编辑:

MSDN还声明:

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

这间接地证实了WPF4释放的说法毕竟是准确的…

但我赞成WPF4释放的观点-基于MSDN描述

文档中说,您只能在特定线程上访问
DispatcherObject
的成员,因此从任意线程使用它是不安全的。对我来说,这似乎是一种线程不安全的类型

另一方面,您可以考虑如果使用<代码> DeXCurbObjs<代码>,则类中的代码不必考虑线程安全性,因为它只应从单个线程调用。


所以从某种意义上说,这是“从外部看线程不安全,从内部看线程安全”。我更喜欢使用更具描述性的术语:类具有线程亲和力。

取决于您对线程安全的定义。但是如果“只有创建Dispatcher的线程可以直接访问DispatcherObject”,它不是线程安全吗?因为它不能从UI线程上创建的线程调度程序之外的其他线程进行访问,UI线程有效吗?@kzen:它不能从任何其他线程进行正确访问-但是没有什么可以阻止您尝试在代码中进行访问。如果你幸运的话,它会在执行的时候爆炸;如果你不幸运的话,它会在执行的时候工作。这就像说,
IDisposable
实现自然是资源安全的:如果你正确地使用它们,它们是安全的,但是你仍然需要投入工作来确保你处理掉它们…Eric的精彩文章,感谢你的链接。。。穿线非常有趣;)@kzen:“埃里克的优秀帖子”几乎是一个同义反复;)无人到达的地方。。乔恩·斯基特到达了!