全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c# Invoke和BeginInvoke 区别本文由mspecial_19贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 c# Invoke 和 BeginInvoke 区别 2009-11-06 16:38 近日,被 Control 的 Invoke 和 BeginInvoke 搞的头大,就查了些相关的资料,整理如下. 感谢这篇文章对我的理解 Invoke 和 BeginInvoke 的真正含义 . (一)Control 的 Invoke 和 BeginInvoke 我们要基于以下认识: (1)Control 的 Invoke 和 BeginInvoke 与 Delegate 的 Invoke 和 BeginInvoke 是不同的. (2)Control 的 Invoke 和 BeginInvoke 的参数为 delegate,委托的方法是在 Control 的线 程上执行的,也就是我们平时所说的 UI 线程. 我们以代码(一)来看(Control 的 Invoke) private delegate void InvokeDelegate(); private void InvokeMethod() /C 代码段 private void butInvoke_Click(object sender, EventArgs e) /A 代码段 this.Invoke(new InvokeDelegate(InvokeMethod); /B 代码段 你觉得代码的执行顺序是什么呢?记好 Control 的 Invoke 和 BeginInvoke 都执行在主线程 即 UI 线程上 ACB 解释:(1)A 在 UI 线程上执行完后,开始 Invoke,Invoke 是同步 (2)代码段 B 并不执行,而是立即在 UI 线程上执行 InvokeMethod 方法,即代码段 C. (3)InvokeMethod 方法执行完后,代码段 C 才在 UI 线程上继续执行. 看看代码(二),Control 的 BeginInvoke private delegate void BeginInvokeDelegate(); private void BeginInvokeMethod() /C 代码段 private void butBeginInvoke_Click(object sender, EventArgs e) /A 代码段 this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod); /B 代码段 你觉得代码的执行顺序是什么呢?记好 Control 的 Invoke 和 BeginInvoke 都执行在主线程 即 UI 线程上 ABC 慎重,这个只做参考 .,我也不肯定执行顺序,如果有哪 位达人知道的话请告知. 解释: :(1)A 在 UI 线程上执行完后,开始 BeginInvoke,BeginInvoke 是异步 (2)InvokeMethod 方法,即代码段 C 不会执行,而是立即在 UI 线程上执行代码段 B. (3)代码段 B 执行完后(就是说 butBeginInvoke_Click 方法执行完后),InvokeMethod 方法, 即代码段 C 才在 UI 线程上继续执行. 由此,我们知道: Control 的 Invoke 和 BeginInvoke 的委托方法是在主线程,即 UI 线程上执行的.也就是 说如果你的委托方法用来取花费时间长的数据, 然后更新界面什么的, 千万别在 UI 线程上调 用 Control.Invoke 和 Control.BeginInvoke,因为这些是依然阻塞 UI 线程的,造成界面的假死. 那么,这个异步到底是什么意思呢? 异步是指相对于调用 BeginInvoke 的线程异步,而不是相对于 UI 线程异步,你在 UI 线 程上调用 BeginInvoke ,当然不行了.摘自Invoke 和 BeginInvoke 的真正涵义一文 中的评论. BeginInvoke 的 原 理 是将调 用 的 方法 Marshal 成消 息 , 然 后调 用 Win32 API 中 的 RegisterWindowMessage()向 UI 窗口发送消息. 摘自Invoke 和 BeginInvoke 的真正涵 义一文中的评论. (二)我们用 Thread 来调用 BeginInvoke 和 Invoke 我们开一个线程,让线程执行一些耗费时间的操作,然后再用 Control.Invoke 和 Control.BeginInvoke 回到用户 UI 线程,执行界面更新. 代码(三) Thread 调用 Control 的 Invoke private Thread invokeThread; private delegate void invokeDelegate(); private void StartMethod() /C 代码段 Control.Invoke(new invokeDelegate(invokeMethod); /D 代码段 private void invokeMethod() /E 代码段 private void butInvoke_Click(object sender, EventArgs e) /A 代码段 invokeThread = new Thread(new ThreadStart(StartMethod); invokeThread.Start(); /B 代码段 你觉得代码的执行顺序是什么呢?记好 Control 的 Invoke 和 BeginInvoke 都执行在主线程 即 UI 线程上 A(Start 一开始 B 和 StartMethod 的 C 就同时执行)(C 执行完了,不管 B 有没有 执行完,invokeThread 把消息封送(invoke)给 UI 线程,然后自己等待)UI 线程处理完 butInvoke_Click 消息后,处理 invokeThread 封送过来的消息,执行 invokeMethod 方法,即代 码段 E,处理往后 UI 线程切换到 invokeThread 线程. 这个 Control.Invoke 是相对于 invokeThread 线程同步的,阻止了其运行. 解释: 1.UI 执行 A 2.UI 开线程 InvokeThread,B 和 C 同时执行,B 执行在线程 UI 上,C 执行在线程 invokeThread 上. 3.invokeThread 封送消息给 UI,然后自己等待,UI 处理完消息后,处理 invokeThread 封送的消息,即代码段 E 4.UI 执行完 E 后,转到线程 invokeThread 上,invokeThread 线程执行代码段 D 代码(四) Thread 调用 Control 的 BeginInvoke private Thread beginInvokeThread; private delegate void beginInvokeDelegate(); private void StartMethod() /C 代码段 Control.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod); /D 代码段 private void beginInvokeMethod() /E 代码段 private void butBeginInvoke_Click(object sender, EventArgs e) /A 代码段 beginInvokeThread = new Thread(new ThreadStart(StartMethod); beginInvokeThread .Start(); /B 代码段 你觉得代码的执行顺序是什么呢?记好 Control 的 Invoke 和 BeginInvoke 都执行在主线程 即 UI 线程上 A 在 UI 线程上执行beginInvokeThread 线程开始执行,UI 继续执行代码段 B,并发 地 invokeThread 执 行 代 码 段 C 不 管 UI 有 没 有 执 行 完 代 码 段 B , 这 时 beginInvokeThread 线程把消息封送给 UI,单自己并不等待,继续向下执行UI 处理完 butBeginInvoke_Click 消息后,处理 beginInvokeThread 线程封送过来的消息. 解释: 1.UI 执行 A 2.UI 开线程 beginInvokeThread,B 和 C 同时执行,B 执行在线程 UI 上,C 执行在线程 beginInvokeThread 上. 3.beginInvokeThread 封送消息给 UI,然后自己继续执行代码 D,UI 处理完消息后,处 理 invokeThread 封送的消息,即代码段 E 有点疑问:如果 UI 先执行完毕,是不是有可能过了段时间 beginInvokeThread 才把消息 封送给 UI,然后 UI 才继续执行封送的消息 E.如图浅绿的部分. Control 的 BeginInvoke 是相对于调用它的线程,即 beginInvokeThread 相对是异步的. 因此,我们
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国家管网集团2026届高校毕业生招聘笔试备考试题(浓缩500题)及答案详解(有一套)
- 2026国网吉林省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(考试直接用)
- 2026秋季国家管网集团华中公司高校毕业生招聘考试参考试题(浓缩500题)及答案详解(夺冠系列)
- 2025国网上海市电力校园招聘(提前批)笔试模拟试题浓缩500题附答案详解(a卷)
- 国家管网集团2025届高校毕业生招聘笔试历年参考题库附带答案详解(浓缩500题)附参考答案详解(基础题)
- 2026国家管网集团广西公司秋季高校毕业生招聘笔试参考题库(浓缩500题)附答案详解(精练)
- 2026国网北京市电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(精练)
- 2026年黔西南州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(综合卷)
- 2025国网湖北省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(培优b卷)
- 2026国家管网集团高校毕业生招聘笔试参考题库(浓缩500题)附参考答案详解(典型题)
- 移动公司县级分公司总经理竞职演讲稿
- 投标评标项目经理答辩题库题
- 护理查房胎盘早剥
- JJG 564-2019重力式自动装料衡器
- GB/T 4889-2008数据的统计处理和解释正态分布均值和方差的估计与检验
- GB/T 15317-2009燃煤工业锅炉节能监测
- 消防知识测试题库(1000道含各题型)
- 《轴承的失效分析》教学课件
- 部编人教版六年级道德与法治上册全册教学课件
- 化工厂员工电气安全教育培训课件
- 成人学位英语考试大纲词汇表
评论
0/150
提交评论