加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:43:59 所属栏目:百科 来源:网络整理
导读:在 Winforms中,所有控件都有一个InvokeRequired属性,如果我必须调用,则返回true.[Begin]调用控件以修改它. 在WPF中,DispatcherObject.CheckAccess()和Dispatcher.CheckAccess()中有一个类似的构造,但我受到EditorBrowsable(EditorBrowsableState.Never)属性
在 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读