Dispatcher.Invoke方法
前一篇小猪分享过在WPF中简单的使用BackgroundWorker完成多线程操作!在那篇中小猪利用了BackgroundWorker组件对耗时比较多的操作放在了单独的BackgroundWorker里来完成,例如说:网络请求的登录操作,说到网络请求当然还有另外一种请求:网络下载。
当客户端需要进行网络下载操作时如果只是简单的用多线程这么一个操作而不给用户知道当前的下载进度的话那么用户将不知道已经下载了多少,甚至有可能直接关闭了主应用程序。那就杯具了。
这时候就涉及到在另外的线程中来更新UI,但是WPF却明确的规定:UI元素只能由其主线程来操作,其他任何线程都不可以直接操作UI。而实时的下载进度又不能通过调用某个回调函数来完成更新UI。
引用:
这时候就是Dispatcher.Invoke方法上场的时间了
引用:
下面代码实现了我们想要的功能:
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方法相关推荐
- JAVA深入研究——Method的Invoke方法。
在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...
- invokeRequired属性和 invoke()方法
zt: http://www.x2blog.cn/jinhong618/?tid=22389 问: f (this.InvokeRequired) { ...
- invoke 数组_对于反射中的invoke()方法的理解
作者:码上猿梦http://cnblogs.com/daimajun/p/6545533.html 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模 ...
- InvocationHandler的invoke方法如何被调用?
关键问题是它们内在的联系.虽然可以看源代码,包括类库.但是把它们抽象出来,有助于理解. 在客户类(即以下代码的Client类),语句Manager managerProxy = (Manager) ...
- invoke方法是做啥的_使用 NLog 给 Asp.Net Core 做请求监控
为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...
- invoke方法_JVM是如何执行方法调用的?
前不久在写代码的时候,我不小心踩到一个可变长参数的坑.你或许已经猜到了,它正是可变长参数方法的重载造成的. 我把踩坑的过程放在了文稿里,你可以点击查看. void invoke(Object obj, ...
- 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成 ...
- 反射之invoke方法
当获得类对应的Class对象后,可以通过getMethods()方法得到全部方法--返回Method数组,或者getMethod()方法来获取指定方法--Method对象. 可以通过Method对象的 ...
- .invokeRequired属性和 invoke()方法
问: f (this.InvokeRequired) { this.BeginInvoke(new MethodInvoker(LoadGlob ...
最新文章
- Mysql 主从延时监控(pt-heartbeat)详解
- insta经典滤镜下载
- FireDAC 下的 Sqlite [7] - 备份、优化、事务(Transaction)
- c语言 int64 t占位符,为什么我会得到“您必须为dtype int64提供占位符张量输出值”?...
- Dubbo系统间通信
- HTML5网页APP连接MQTT,使用js连接mqtt
- ASP.NETCore的Kestrel服务器
- 东芝M300系列笔记本拆解图片教程 (跟自己电脑很像)
- Bridge(桥接)-对象结构型模式
- LINUX用C判断文件是否存在
- QT编译项目错误:转换到coff期间失败文件无效或损坏
- ccnp计算机英语,英语不好可以学习CCNA或是CCNP吗?
- 数学建模 Lingo 基本算法模板
- 计算机二级可以用笔记本电脑学吗,计算机二级可以自学好过吗
- 通过bat文件加密文件夹,放入你的秘密小电影
- MySQL知识点整理汇总
- 裁员狂潮席卷硅谷:Meta史上最大规模裁员将至,英特尔被曝裁掉数千人
- mysql复合索引(联合索引)的使用场景
- NSIS ERROR解决方法
- “多视角交叉认知----《发现的乐趣》,TED演讲-数学是理解万物之源,徐冰《创造力从哪里来》”主题作文