的System.Windows.Threading.DispatcherObject
类(DependencyObject
基于)包含有用的功能,称为CheckAccess()
,确定所述代码是否被UI线程上运行.
当我昨天想要使用它时,我很困惑地发现Intellisense没有显示该函数(也没有VerifyAccess()
,当不在UI线程上时抛出异常),即使MSDN库列出它.我决定使用Reflector调查这个类.似乎有问题的函数EditorBrowsable(EditorBrowsableState.Never)
附加了一个属性.使用的Dispatcher
类DispatcherObject
具有附加到的相同属性CheckAccess()
和VerifyAccess()
:
public abstract class DispatcherObject { // ... [EditorBrowsable(EditorBrowsableState.Never)] public bool CheckAccess(); [EditorBrowsable(EditorBrowsableState.Never)] public void VerifyAccess(); // ... [EditorBrowsable(EditorBrowsableState.Advanced)] public Dispatcher Dispatcher { get; } } public sealed class Dispatcher { // ... [EditorBrowsable(EditorBrowsableState.Never)] public bool CheckAccess(); [EditorBrowsable(EditorBrowsableState.Never)] public void VerifyAccess(); // ... }
我不相信该属性的应用是随机的(或一个笑话),所以我的问题是:它为什么存在?这些方法不应该直接调用吗?那么为什么不是它们protected
(或者internal
,像WPF中一些最有用的方法)?
微软员工最近表示 CheckAccess仅用于"高级方案",因此他们将其隐藏在Intellisense中.
"CheckAccess和VerifyAccess一直被标记为不可见,也许IntelliSense不尊重它.您可以使用Reflector进行确认.这里的想法是CheckAccess和VerifyAccess是正常开发人员不需要的进步方案.
但是,我确实认为EditorBrowsableState.Advanced会更合适."
针对这个缺点,有一个Microsoft Connect案例.如果它对你很重要,请投票给它.