前一篇小猪分享过在WPF中简单的使用BackgroundWorker完成多线程操作!在那篇中小猪利用了BackgroundWorker组件对耗时比较多的操作放在了单独的BackgroundWorker里来完成,例如说:网络请求的登录操作,说到网络请求当然还有另外一种请求:网络下载。

当客户端需要进行网络下载操作时如果只是简单的用多线程这么一个操作而不给用户知道当前的下载进度的话那么用户将不知道已经下载了多少,甚至有可能直接关闭了主应用程序。那就杯具了。

这时候就涉及到在另外的线程中来更新UI,但是WPF却明确的规定:UI元素只能由其主线程来操作,其他任何线程都不可以直接操作UI。而实时的下载进度又不能通过调用某个回调函数来完成更新UI。

引用:

WPF中的UI控件,如果我们探究本质,他们都是从DispatcherObject继承,所以都必须由UI线程进行调度和使用,如果我们在其他的后台线程中操作界面相关的元素时,就会出现如下的异常信息:
调用线程无法访问此对象,因为另一个线程拥有该对象。

这时候就是Dispatcher.Invoke方法上场的时间了

引用:

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

下面代码实现了我们想要的功能:

private delegate void SetTipsValue_dg(long solength, long stlength);
private void SetTipsValue(long solength, long stlength)
{block_Tips.Text = "下载中...." + solength + "/" + stlength;
}

private bool DownloadFile(string URL, string filename)
{try{System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL);System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();System.IO.Stream st = myrp.GetResponseStream();long stll = myrp.ContentLength;System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);byte[] by = new byte[1024];int osize = st.Read(by, 0, (int)by.Length);while (osize > 0){long sol = so.Length;long stl = stll;this.block_Tips.Dispatcher.Invoke(new SetTipsValue_dg(SetTipsValue), sol, stl);so.Write(by, 0, osize);osize = st.Read(by, 0, (int)by.Length);}so.Close();st.Close();myrp.Close();Myrq.Abort();return true;}catch (System.Exception e){return false;}
}

上面代码首先定义了一个委托:该委托接受两个参数分别代表当前下载量和总下载量,然后定义了一个具体的实现该委托的方法,该方法调用UI来显示数据。

在下载数据的主函数DownloadFile中调用了this.block_Tips.Dispatcher.Invoke方法并将实现了委托的方法SetTipsValue方法和当前下载量及总下载量的数值传进去我们就完成了整个操作。这样我们在下载数据的时候用另外的线程开启了DownloadFile方法就可以实时的显当前的下载进度了。

转载于:https://www.cnblogs.com/smallerpig/p/3646230.html

Dispatcher.Invoke方法相关推荐

  1. JAVA深入研究——Method的Invoke方法。

    在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...

  2. invokeRequired属性和 invoke()方法

    zt: http://www.x2blog.cn/jinhong618/?tid=22389 问: f (this.InvokeRequired)             {              ...

  3. invoke 数组_对于反射中的invoke()方法的理解

    作者:码上猿梦http://cnblogs.com/daimajun/p/6545533.html 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模 ...

  4. InvocationHandler的invoke方法如何被调用?

    关键问题是它们内在的联系.虽然可以看源代码,包括类库.但是把它们抽象出来,有助于理解. 在客户类(即以下代码的Client类),语句Manager managerProxy =   (Manager) ...

  5. invoke方法是做啥的_使用 NLog 给 Asp.Net Core 做请求监控

    为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...

  6. invoke方法_JVM是如何执行方法调用的?

    前不久在写代码的时候,我不小心踩到一个可变长参数的坑.你或许已经猜到了,它正是可变长参数方法的重载造成的. 我把踩坑的过程放在了文稿里,你可以点击查看. void invoke(Object obj, ...

  7. 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

    反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成 ...

  8. 反射之invoke方法

    当获得类对应的Class对象后,可以通过getMethods()方法得到全部方法--返回Method数组,或者getMethod()方法来获取指定方法--Method对象. 可以通过Method对象的 ...

  9. .invokeRequired属性和 invoke()方法

    问: f (this.InvokeRequired)             {                 this.BeginInvoke(new MethodInvoker(LoadGlob ...

最新文章

  1. Mysql 主从延时监控(pt-heartbeat)详解
  2. insta经典滤镜下载
  3. FireDAC 下的 Sqlite [7] - 备份、优化、事务(Transaction)
  4. c语言 int64 t占位符,为什么我会得到“您必须为dtype int64提供占位符张量输出值”?...
  5. Dubbo系统间通信
  6. HTML5网页APP连接MQTT,使用js连接mqtt
  7. ASP.NETCore的Kestrel服务器
  8. 东芝M300系列笔记本拆解图片教程 (跟自己电脑很像)
  9. Bridge(桥接)-对象结构型模式
  10. LINUX用C判断文件是否存在
  11. QT编译项目错误:转换到coff期间失败文件无效或损坏
  12. ccnp计算机英语,英语不好可以学习CCNA或是CCNP吗?
  13. 数学建模 Lingo 基本算法模板
  14. 计算机二级可以用笔记本电脑学吗,计算机二级可以自学好过吗
  15. 通过bat文件加密文件夹,放入你的秘密小电影
  16. MySQL知识点整理汇总
  17. 裁员狂潮席卷硅谷:Meta史上最大规模裁员将至,英特尔被曝裁掉数千人
  18. mysql复合索引(联合索引)的使用场景
  19. NSIS ERROR解决方法
  20. “多视角交叉认知----《发现的乐趣》,TED演讲-数学是理解万物之源,徐冰《创造力从哪里来》”主题作文

热门文章

  1. Play Framework 2.5 整合 MyBatis
  2. Ubuntu下安装mysql与mysql workbench
  3. IntelliJ IDEA中JAVA连接MYSQL
  4. 【iCore3 双核心板】例程十七:USB_MSC实验——读/写U盘(大容量存储器)
  5. JSON转换和毫秒时间
  6. OGEngine开源引擎环境搭建
  7. 一个学机械的毕业生令中国人无法安眠的帖子
  8. docker swarm英文文档学习-8-在集群中部署服务
  9. 云企业网的应用于功能详解
  10. 01:谁考了第k名 个人博客:doubleq.win