先看下面实实例代码

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的区别的更多相关文章

  1. C#中Invoke 和 BeginInvoke 的区别

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

  2. jquery bind、delegate、live、on的区别及联系

    jquery bind.delegate.live.on的区别及联系 概述 jquery提供了好几个API都可以实现事件绑定, 如 delegate, live , bind 等, 可是有没有疑惑这几 ...

  3. delegate的Invoke和BeginInvoke方法

    C#中的控件和delegate委托方法都有Invoke和BeginInvoke方法,控件的这两个方法网上讲得很多, 这里就不多说了,下面讲一下delegate的Invoke和BeginInvoke方法 ...

  4. Invoke和BeginInvoke的区别(转载)

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

  5. Invoke 和 BeginInvoke 的区别(转发)

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...

  6. Invoke 与 BeginInvoke的区别

    引用文章路径:https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke ...

  7. C#中Delegate和Event以及它们的区别(转载)

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  8. C#中Invoke和BeginInvoke的区别

    1.Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念. 2.BeginInvoke() 调用时,当前线程会启用线 ...

  9. Delegate成员变量和Event的区别

    上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别.   我的第一反应是没啥区别 ...

随机推荐

  1. 【Excel】获取网页标题的VBA

    在宏录制,完成后可以直接在网格上调用Title(网址).但好些会访问不了,原因不明. Function Title(ByVal url As String) As StringOn Error Res ...

  2. 最全js 放大镜效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. UVAlive 6833 Miscalculation 字符串处理

    去年省选的题 因为卡了这道题再加上队友占机时 省选第一天华丽爆零了 用事实证明了1+1+1<1的事实 毕竟下半年单挑了东北赛名额 省赛打不出来名额就真的就不怪我了(摔 现在有拿出来做 长个记性 ...

  4. hdu 1564 Play a game(博弈找规律)

    题目:一个n*n的棋盘,每一次从角落出发,每次移动到相邻的,而且没有经过的格子上. 谁不能操作了谁输. 思路:看起来就跟奇偶性有关 走两步就知道了 #include <iostream> ...

  5. USACO 3.1 Humble Numbers

    Humble Numbers For a given set of K prime numbers S = {p1, p2, ..., pK}, consider the set of all num ...

  6. 网络爬虫-获取infoq里的测试新闻保存至html

    用java+webdriver+testng实现获取infoq里的测试新闻,获取文章标题和内容,保存至html文件 前提条件: 已安装好java环境,工程导入了webdriver的jar包和testn ...

  7. informix 存储过程结构

    1.简介         存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行 ...

  8. Anaconda 安装概要

    Anaconda 作为开源项目,集成了Python的大部分第三方包,如:pandas,Numpy,scipy等. 1. 下载地址:https://www.continuum.io/downloads ...

  9. textview设置不同字体大小

    <style name="style0"> <item name="android:textSize">19dip</item&g ...

  10. C# XML配置文件读写类(用于程序配置保存)

    调用方式 //初始化并指定文件路径 XmlConfigUtil util = new XmlConfigUtil("C:\\1.xml"); //写入要保存的值以及路径(Syste ...