博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Note28: Dispatcher类
阅读量:6153 次
发布时间:2019-06-21

本文共 1813 字,大约阅读时间需要 6 分钟。

 在项目中也是经常用到:

 

刚见到它时,你会想:为什么不直接使用System.Windows命名空间下的MessageBox类,何必要这么麻烦?(认真分析看它做了什么,具体原因下面解释)

 

主要介绍的方法:

  • Dispatcher.Invoke 方法

作用:在与  关联的线程上同步执行指定的委托。

  • Dispatcher.CheckAccess 方法

作用:确定调用线程是否为与此  关联的线程。

注:CheckAccess 可以从任意线程中调用。CheckAccess 和 VerifyAccess 之间的区别在于 CheckAccess 将返回一个布尔值,指示调用线程是否可以访问 Dispatcher,而VerifyAccess 将引发一个异常。

 

PS:在 WPF 中,只有创建  的线程才能访问该对象。 例如,一个从主 UI 线程派生的后台线程不能更新在该 UI 线程上创建的 的内容。 为了使该后台线程能够访问  的 Content 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 。 使用  或BeginInvoke 来完成此操作。  是同步操作,而 BeginInvoke 是异步操作。 该操作将按指的  添加到  的事件队列中。

Invoke 是同步操作;因此,直到回调返回之后才会将控制权返回给调用对象。

BeginInvoke 是异步操作;因此,调用之后控制权会立即返回给调用对象。

BeginInvoke 返回一个  对象,当委托位于事件队列中时,该对象可用于与委托进行交互。

由 BeginInvoke 返回的  对象可以采用多种方式与指定的委托进行交互,例如:

  • 当在事件队列中挂起执行时,更改委托的 。

  • 从事件队列中移除委托。

  • 等待委托返回。

  • 获取委托执行之后返回的值。

如果按同一个  调用多个 BeginInvoke,将按调用发生的顺序执行它们。

如果对某个已关闭的  调用 BeginInvoke,则返回的  的状态属性将设置为 。

 

MSDN示例e:

使用 CheckAccess 确定某个线程是否可以访问 。通过调用与  关联的  上的 CheckAccess 方法可以验证是否可以访问该线程。 如果调用线程可以访问 ,则可通过访问  的成员来更新 ;否则,将接受  作为参数的委托放置到 中。  将委托更新  的工作。

// Uses the Dispatcher.CheckAccess method to determine if // the calling thread has access to the thread the UI object is on.private void TryToUpdateButtonCheckAccess(object uiObject){    Button theButton = uiObject as Button;    if (theButton != null)    {        // Checking if this thread has access to the object.        if (theButton.Dispatcher.CheckAccess())        {            // This thread has access so it can update the UI thread.            UpdateButtonUI(theButton);        }        else        {            // This thread does not have access to the UI thread.            // Place the update method on the Dispatcher of the UI thread.            theButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal,                new UpdateUIDelegate(UpdateButtonUI), theButton);        }    }}

 

转载于:https://www.cnblogs.com/carsonzhu/p/7451475.html

你可能感兴趣的文章
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>