22

该类System.Windows.Threading.DispatcherObjectDependencyObject基于)包含一个有用的函数,称为CheckAccess(),它确定代码是否在 UI 线程上运行。

当我昨天想使用它时,我很困惑地发现 Intellisense 没有显示该功能(也VerifyAccess()没有在 UI 线程上时抛出异常),即使 MSDN 库列出了它。我决定使用 Reflector 来研究这门课。似乎有问题的函数EditorBrowsable(EditorBrowsableState.Never)附加了一个属性。由 使用的DispatcherDispatcherObject具有附加到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 中一些最有用的方法)?

4

2 回答 2

9

一位微软员工最近表示CheckAccess 仅用于“高级场景”,因此他们将其隐藏在 Intellisense 中。

“CheckAccess和VerifyAccess一直被标记为不可见,可能是IntelliSense不尊重它。你可以使用Reflector来确认。这里的想法是CheckAccess和VerifyAccess是高级场景,普通开发者不需要。

但是,我确实认为 EditorBrowsableState.Advanced 会是更合适的级别。”

针对这个缺点,有一个 Microsoft Connect 案例。如果它对您很重要,请投票给它。

于 2008-10-01T14:59:31.647 回答
0

我找不到任何说明您不应该直接使用这些方法的文档,但我看的时间不长。

您还参考了 EditorVisibleAttribute,它不存在。根据 Reflector,它是EditorBrowsableAttribute

反光板拆卸:

[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess()
{
//CODE
}
于 2008-08-20T07:22:02.960 回答