c# delegate的invoke和bejinInvoke的区别
先看下面实实例代码
private delegate void testdg();
private void button1_Click(object sender, EventArgs e)
{
testdg dg = new testdg(DgGo);
dg.Invoke();
}
private void DgGo()
{
Thread.Sleep(3000);
}
此时会卡主ui线程。虽然delegate.invoke()方法会从线程池中调用线层异步执行,但会卡主调用他的线程,上述实例中即为ui线程。
如果改成beginInvoke()方法也会从线程池中调用线程异步执行,但并不会让调用其线程等待,即不会卡主上面的ui线程。
再下面的一个实例
public partial class Form1 : Form
{
private delegate void testdg();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(new Action(() =>
{
testdg dg = new testdg(DgGo);
dg.Invoke();
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); //等待DgGo执行完成后才会执行到这句
}))).Start();
}
private void DgGo()
{
Thread.Sleep(3000);
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
}
}
通过多次测试发现两次messagebox弹出的threadId竟然一样所以这里就有个疑问delegate.invoke是不是就是使用当前调用的线程来执行该委托代理的方法?
下面看看,bejinInvoke的执行情况
public partial class Form1 : Form
{
private delegate void testdg();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(new Action(() =>
{
testdg dg = new testdg(DgGo);
dg.BeginInvoke(null,null);
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());//该方法会立即执行,并不会等待DgGo方法执行完成后执行。这说明beginInvoke是启用单独线程执行的。
}))).Start();
}
private void DgGo()
{
Thread.Sleep(3000);
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
}
}
通过messagebox show出来的线程id也不一样更进一步说明了使用是不同的线程。
c# delegate的invoke和bejinInvoke的区别的更多相关文章
- C#中Invoke 和 BeginInvoke 的区别
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...
- jquery bind、delegate、live、on的区别及联系
jquery bind.delegate.live.on的区别及联系 概述 jquery提供了好几个API都可以实现事件绑定, 如 delegate, live , bind 等, 可是有没有疑惑这几 ...
- delegate的Invoke和BeginInvoke方法
C#中的控件和delegate委托方法都有Invoke和BeginInvoke方法,控件的这两个方法网上讲得很多, 这里就不多说了,下面讲一下delegate的Invoke和BeginInvoke方法 ...
- Invoke和BeginInvoke的区别(转载)
转自http://www.cnblogs.com/c2303191/articles/826571.html Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线 ...
- Invoke 和 BeginInvoke 的区别(转发)
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...
- Invoke 与 BeginInvoke的区别
引用文章路径:https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke ...
- C#中Delegate和Event以及它们的区别(转载)
一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...
- C#中Invoke和BeginInvoke的区别
1.Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念. 2.BeginInvoke() 调用时,当前线程会启用线 ...
- Delegate成员变量和Event的区别
上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别. 我的第一反应是没啥区别 ...
随机推荐
- Mac os 下使用gem命令的坑
在安装sass的时候,发现无论如何都装不上. 于是各种搜索资料.终于在网上找到了原因.在这里附上地址,感谢作者. https://argcv.com/articles/4429.c 为了加深理解同时防 ...
- Eclipse/MyEclipse 安裝後應該更改的設置
基本上都通過 Window -> Preferences 進行設置: Java 保存自動格式化: Java:Java -> Editor -> Save Actions,選中 Per ...
- C# 修改iframe url
一.修改本级的iframe url 首先在js中编写函数: <script type="text/javascript"> function reloadfrm2() ...
- Leetcode-34-Search for a Range-(Medium)
这道题借助二分查找算法来查找目标值的index 然后向前和向后分别搜索起始边界 注意开始排除异常值优化速度 #!/usr/local/bin/python3 # -*- coding: utf-8 - ...
- Ansible安装配置
Ansible工具的安装与配置 Ansible基于SSH,不需要在远程端安装任何软件,只需要在管理端安装ansible及其组件即可. Ansible使用前提是已配置ssh密钥免登陆. 一.安装组件: ...
- TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts
1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...
- jquery 自动触发事件 trigger
trigger() 栗子: 需求:我们在做二级联动的时候往往会遇到这样的需求,后台管理端页面加载完成后显示用户的省份,城市,并且可以对用户的省份,城市信息可以修改 如果只是简单的显示 你完全可以直接放 ...
- Html5NodeJs安装less之千辛万苦CMD系列
如题,这个东西很是费了一般脑筋 上一次讲了如何在浏览器端解析less文件,这次是在cmd中使用npm中的less模块来解析 详解如下 首下我们去下载一个NodeJs, 我下载的是4.44版本,一路 ...
- tomcat配置https方法
利用tomcat服务器配置https双向认证 步骤 1.为服务器生成证书进入控制台,切换到%JAVA_HOME%/bin目录,具体操作略. 使用keytool为Tomcat生成证书,假定目标机器的域名 ...
- on事件绑定阻止冒泡的问题
当使用on进行事件绑定时当要给document绑定click,而子元素要禁止冒泡,那么子元素里面的子元素的click事件就会无效了, 下面无效版: $('#queue').on('click', '. ...