先看下面实实例代码

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. ARCH-LINUX 折(安)腾(装)记

    2016-08-09 前几天装的manjaro一直卡住,今天想换archlinux.... 先联个网.....wifi-menu 写入U盘 tuna 下载了ISO UltraISO 写进U盘,结果出问 ...

  2. [UWP小白日记-7]转换MVA学院的XML字幕为SRT (二)

    瞎扯淡 上个版本,非常蠢用来N多的循环导致非常卡性能烂得不行,这次使用XmlDocument类来读取XML字幕 其实根本不用各种扒XML字幕,好吧我这是学习使用XmlDocument类,嗯就是这个样子 ...

  3. 一台服务器上同时启动多个 Tomcat

    在同一台服务器上启动多个 Tomcat 服务,需要修改 conf/server.xml文件里的三个部分,如下: 1.修改Http访问端口(默认为8080端口) <Connector port=& ...

  4. Tip of the Day

    Did you know ... ? You can view all statements within the method where certain exceptions can be cau ...

  5. JS正则表达式之特殊符号

    在正则表达式中,许多标点符号具有特殊含义,比较难记,现归纳备个份: 这些符号有:^ $ . * +  - ? = ! : | \ / ( ) [ ] { } 1."[ ]"表示字符 ...

  6. QGIS

    project(GisFreeMap) set(CMAKE_BUILD_TYPE Debug) find_package(Qt4 REQUIRED QtCore QtGui QtXml) includ ...

  7. WPF和Winform的一些界面控件

    DevExpressTelerikMahApps.MetroModern UI for WPFModernWPFExtended WPF Toolkit™ Community EditionModer ...

  8. jsp中使用java函数

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> ${fn ...

  9. HDU 5869 Different GCD Subarray Query

    离线操作,树状数组,$RMQ$. 这个题的本质和$HDU$ $3333$是一样的,$HDU$ $3333$要求计算区间内不同的数字有几个. 这题稍微变了一下,相当于原来扫描到$i$的之后是更新$a[i ...

  10. USACO 3.2 Magic Squares

    Magic SquaresIOI'96 Following the success of the magic cube, Mr. Rubik invented its planar version, ...