C# · 12月 29, 2021

c# – 正确使用(或不使用)Dispatcher.CheckAccess()

在 Winforms中,所有控件都有一个Invokerequired属性,如果我必须调用,则返回true.[Begin]调用控件以修改它.

在WPF中,DispatcherObject.CheckAccess()和Dispatcher.CheckAccess()中有一个类似的构造,但我受到EditorBrowsable(EditorBrowsableState.Never)属性的吓坏.当我禁用这样的编辑器浏览时,我使用它来表示“你不应该这样做,不,真的,如果这是必要的,解决你的直接问题,你错误地设计了你的解决方案到你的首要问题.另一方面,我发现的唯一的替代方法(实际上是我的原始解决方案)是Thread.CurrentThread.ManagedThreadId == 1(这是可怕的,它在通用情况下不起作用,我知道.尽管如此,它对我的​​有限的使用是有效的.)

MSDN documentation没有提到EditorBrowsable属性背后的存在和推理.这是否意味着“不要使用这个”,因为如果我打了它,还是有其他一些禁忌的意思呢?

解决方法 在WPF中,您可以调用Dispatcher.Invoke,而不管当前的线程如何,它会相应地处理调用 – 如果您已经在正确的线程上,那么它将调用代码,并使用CheckAccess来处理此行为.

对于BeginInvoke,您当前使用的线程是无关紧要的:BeginInvoke始终是异步的,执行顺序取决于添加到调度程序队列中的项目的优先级.

如果您根本不使用该方法,则不会公开:该属性的意图只是将成员隐藏在诸如Intellisense和其他编辑器浏览器之类的机制中.您通常不需要自己使用Dispatcher.CheckAccess(),这可能是为什么它被标记为不可浏览,但是这个智慧是我们只能猜到的(除非Eric Lippert正在观看;-)

总结:只需调用Dispatcher.Invoke,不用担心CheckAccess.