(转)C# Delegate.Invoke、Delegate.BeginInvoke
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相关推荐
- (转)Invoke and BeginInvoke
Invoke and BeginInvoke 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么 ...
- 为什么Control类提供了Invoke和BeginInvoke机制
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和Begin ...
- 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke(转-因为写得很好)
原文地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html Invoke and BeginInvoke Invok ...
- c# Invoke和BeginInvoke 区别
转自http://www.cnblogs.com/c2303191/articles/826571.html Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线 ...
- c# Invoke和BeginInvoke 区别详解
Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄 ...
- C# 多线程修改控件时遇到:创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
一般在多线程调用UI控件时,涉及到跨线程修改UI,需要使用委托,比如如下: this.Invoke((MethodInvoker)delegate{btnRefresh.Enabled = true; ...
- C#中Invoke 和 BeginInvoke的涵义和区别
BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void treeinvoke(); private void UpdateTreeVi ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Cont ...
- 浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别
今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Cont ...
最新文章
- iOS和OS X中的bundle
- 数据库MySQL/mariadb知识点——函数
- [剑指offer]面试题9:斐波那契数列
- I/0口输入输出实验 流水灯程序 P0、P1、P2、P3口作为输出口,连接八只发光二极管,编写程序,使发光二极管从左至右循环点亮。
- QQ登录JS SDK教程,调用openapi接口
- vim配置c语言开发环境变量,gcc配置和vim编程
- 互联网之达芬奇密码:浪潮揭秘:与中国五亿网民互为影响的互联网DNA
- Python实现扫码工具
- ai图像处理软件集大成者:Leawo PhotoIns Pro中文版介绍
- 比特大陆发布终端 AI 芯片 端云联手聚焦安防
- 为什么网站打得开,却ping不通, 网站却打得开
- Android Q+ 新特性 Settings Panel
- 计算机主板维修试卷,计算机主板维修试卷.doc
- Qt系列文章之 QAbstractItemModel(上)
- PC - 电脑应该多久清洁一次?
- matplotlib 辅助线
- 喜剧院线电影《大夫我没病》在京开机
- .class .class 和 .class.class 和 .class>.class 比较
- Ceph-ansible 安装 ceph (rbd + rgw)
- Lottie系列一:介绍与使用