Delegate的Invoke、BeginInvoke

1、Delegate.Invoke (委托同步调用)

  a、委托的Invoke方法,在当前线程中执行委托。

  b、委托执行时阻塞当前线程,知道委托执行完毕,当前线程才继续向下执行。

  c、委托的Invoke方法,类似方法的常规调用。

2、Delegate.BeginInvoke (委托异步调用)

  a、委托的BeginInvoke方法,在线程池分配的子线程中执行委托

  b、委托执行时不会阻塞主线程(调用委托的BeginInvoke线程),主线程继续向下执行。

  c、委托执行时会阻塞子线程。

  d、委托结束时,如果有返回值,子线程讲返回值传递给主线程;如果有回调函数,子线程将继续执行回调函数。

3、Demo

  a、Delegate

 1         private void btn_General_Click(object sender, EventArgs e)2         {3             txt_Message.Text = "";4             txt_Message.Text += "主线程:"+ Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";5             //委托方法,在调用委托的线程中执行,本例中就是主线程(UI线程)。6             //执行一些耗时的操作,就会阻塞主线程(UI线程)7             //委托的普通调用就等于方法的直接调用,del();等价于SomeWork();8             del();9             //SomeWork();
10             txt_Message.Text += "\r\n主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
11         }

   b、Delegate.Invoke

1         private void btn_Main_Invoke_Click(object sender, EventArgs e)
2         {
3             txt_Message.Text = "";
4             txt_Message.Text += "主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";
5             //委托的同步调用,其实就是等价于委托的普通调用。
6             del.Invoke();
7             txt_Message.Text += "\r\n主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
8         }

 1         private void btn_Sub_Invoke_Click(object sender, EventArgs e)2         {3             txt_Message.Text = "";4             txt_Message.Text += "主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";5 6             //开启新的线程执行委托,主线程(UI线程)继续向下执行7             new Thread(() => {8                 txt_Message.Text += "\r\n----子线程:" + Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";9                 //委托在调用线程中执行,并阻塞调用线程,知道委托方法执行结束。
10                 del.Invoke();
11                 txt_Message.Text += "\r\n----子线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
12             }).Start();
13
14             txt_Message.Text += "\r\n主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
15         }

  c、Delegate.BeginInvoke

 1         private void btn_Main_BeginInvoke_Click(object sender, EventArgs e)2         {3             txt_Message.Text = "";4             txt_Message.Text += "主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";5             //委托异步调用6             //1、委托方法,在线程池中分配的子线程中执行。7             //2、主线程和子线程同时执行。8             //3、子线程结束之后,如果有返回值得话,将返回值传递给主线程。如果有回调函数的话,继续在子线程中执行回调函数。9
10             //有异常,控件不能在子线程中访问修改。
11             //避免这类异常有两种方法
12             //1、手动关闭控件的跨线程安全检查Control.CheckForIllegalCrossThreadCalls = false;(不建议使用)
13             //2、使用控件的Invoke方法。(推荐使用)
14             del.BeginInvoke(null,null);
15             txt_Message.Text += "\r\n主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
16         }

 1         private void btn_Sub_BeginInvoke_Click(object sender, EventArgs e)2         {3             txt_Message.Text = "";4             txt_Message.Text += "主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";5 6             //开启新的线程执行委托,主线程(UI线程)继续向下执行7             new Thread(() =>8             {9                 txt_Message.Text += "\r\n----子线程:" + Thread.CurrentThread.ManagedThreadId + "---开始工作\r\n";
10                 //在线程池中分配的子线程中执行委托方法,调用委托的线程继续向下执行。
11                 del.BeginInvoke(null, null);
12                 txt_Message.Text += "\r\n----子线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
13             }).Start();
14
15             txt_Message.Text += "\r\n主线程:" + Thread.CurrentThread.ManagedThreadId + "---开始结束\r\n";
16         }

  文章转载自:https://www.cnblogs.com/EasonLeung/p/3683492.html

转载于:https://www.cnblogs.com/yeshenmeng/p/9482620.html

(转)C# Delegate.Invoke、Delegate.BeginInvoke相关推荐

  1. (转)Invoke and BeginInvoke

    Invoke and BeginInvoke 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么 ...

  2. 为什么Control类提供了Invoke和BeginInvoke机制

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和Begin ...

  3. 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke(转-因为写得很好)

    原文地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html Invoke and BeginInvoke Invok ...

  4. c# Invoke和BeginInvoke 区别

    转自http://www.cnblogs.com/c2303191/articles/826571.html Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线 ...

  5. c# Invoke和BeginInvoke 区别详解

    Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄 ...

  6. C# 多线程修改控件时遇到:创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

    一般在多线程调用UI控件时,涉及到跨线程修改UI,需要使用委托,比如如下: this.Invoke((MethodInvoker)delegate{btnRefresh.Enabled = true; ...

  7. C#中Invoke 和 BeginInvoke的涵义和区别

    BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void treeinvoke(); private void UpdateTreeVi ...

  8. 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)

    今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Cont ...

  9. 浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别

    今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Cont ...

最新文章

  1. iOS和OS X中的bundle
  2. 数据库MySQL/mariadb知识点——函数
  3. [剑指offer]面试题9:斐波那契数列
  4. I/0口输入输出实验 流水灯程序 P0、P1、P2、P3口作为输出口,连接八只发光二极管,编写程序,使发光二极管从左至右循环点亮。
  5. QQ登录JS SDK教程,调用openapi接口
  6. vim配置c语言开发环境变量,gcc配置和vim编程
  7. 互联网之达芬奇密码:浪潮揭秘:与中国五亿网民互为影响的互联网DNA
  8. Python实现扫码工具
  9. ai图像处理软件集大成者:Leawo PhotoIns Pro中文版介绍
  10. 比特大陆发布终端 AI 芯片 端云联手聚焦安防
  11. 为什么网站打得开,却ping不通, 网站却打得开
  12. Android Q+ 新特性 Settings Panel
  13. 计算机主板维修试卷,计算机主板维修试卷.doc
  14. Qt系列文章之 QAbstractItemModel(上)
  15. PC - 电脑应该多久清洁一次?
  16. matplotlib 辅助线
  17. 喜剧院线电影《大夫我没病》在京开机
  18. .class .class 和 .class.class 和 .class>.class 比较
  19. Ceph-ansible 安装 ceph (rbd + rgw)
  20. Lottie系列一:介绍与使用

热门文章

  1. 开源 java CMS - FreeCMS2.3员
  2. 翻译关于ViewController的一篇文章
  3. [轉]c#简单调用DELPHI DLL封装窗体
  4. 视频直播技术详解(5)延迟优化
  5. 使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算
  6. 推荐系统的应用案例剖析
  7. ubuntu安装过程中遇到问题小结
  8. Mysql连接数据库的操作
  9. jenkins内存溢出的一些解决过程
  10. gulp自动化构建工具--压缩css--学习笔记