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中一些最有用的方法一样?)
答案 0 :(得分:8)
Microsoft员工recently stated CheckAccess仅用于“高级方案”,因此他们将其隐藏在Intellisense中。
“CheckAccess和VerifyAccess有 始终被标记为不可见, 也许IntelliSense不尊重 它。您可以使用Reflector进行确认。 这里的想法是CheckAccess和 VerifyAccess是高级方案, 普通开发人员不需要。
然而,我确实这么认为 EditorBrowsableState.Advanced会 是一个更合适的水平。“
这个缺点有一个Microsoft Connect案例。 Vote for it如果这对你很重要。
答案 1 :(得分:0)
我找不到任何说明你不应该直接使用这些方法的文档,但我看起来不长。
您也可以参考不存在的EditorVisibleAttribute。根据Reflector,它是EditorBrowsableAttribute。
Reflector disassembly:
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess()
{
//CODE
}