zoukankan      html  css  js  c++  java
  • 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也不一样更进一步说明了使用是不同的线程。

  • 相关阅读:
    Linux高级命令-sort、uniq、 cut、sed、grep、find、awk
    Linux netstat命令详解
    linux的top命令
    sysctl -P 报错解决办法
    Linux的用户切换、修改用户的用户名和密码
    后台启动
    查询员工表薪资第二高的人的信息
    警察抓小偷
    汉诺塔
    mysql中给查询出的结果集添加自增序号
  • 原文地址:https://www.cnblogs.com/tianmochou/p/4968270.html
Copyright © 2011-2022 走看看