2008-08-20 48 views
20

System.Windows.Threading.DispatcherObject类(其中DependencyObject基于此类)包含一个有用的函数,称为CheckAccess(),用于确定代码是否在UI线程上运行。为什么从Intellisense隐藏DispatcherObject.CheckAccess()和VerifyAccess()?

当我昨天想要使用它时,即使MSDN库列出它,我也很困惑地​​发现Intellisense没有显示该功能(也不是在UI线程中引发异常的VerifyAccess())。我决定使用反射器来研究这个类。看来这个函数有一个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中一些最有用的方法)?

回答

8

微软员工recently stated的checkAccess仅用于“高级场景”,所以他们把它藏从智能感知。

“的checkAccess和VerifyAccess已 总是被标记为不可见, 也许是智能感知不尊重 它。你可以使用反射来确认。 这里的想法是,和的checkAccess VerifyAccess是进步的方案, 正常的开发人员不需要。

不过,我认为 EditorBrowsableState.Advanced将 是一个比较合适的水平。”

这个缺点有一个Microsoft Connect案例。 Vote for it如果它对你很重要。

+0

上面列出的Microsoft Connect页面不再可用。这里有一个新的报告,如果有人想继续游说以改变这一点:https://connect.microsoft.com/VisualStudio/feedback/details/3133453 – 2017-05-03 18:09:09

0

我找不到任何说你不应该直接使用这些方法的文档,但我看起来并没有很长。

另外您还引用了EditorVisibleAttribute,它不存在。根据Reflector,它是EditorBrowsableAttribute

反射拆解:

[EditorBrowsable(EditorBrowsableState.Never)] 
public bool CheckAccess() 
{ 
//CODE 
}