• 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也不一样更进一步说明了使用是不同的线程。

  • 相关阅读:
    职业的选择
    事务的隔离性理解
    浅谈CSS和JQuery实现鼠标悬浮图片放大效果
    jvm 类加载器
    jvm 类加载
    Spring 启动 Bean加载流程
    优雅的博客园客户端发布Forms版啦。
    Xamarin Forms中WebView的自适应高度
    2017回顾与2018目标
    优雅的博客园Android客户端
  • 原文地址:https://www.cnblogs.com/tianmochou/p/4968270.html
Copyright © 2020-2023  润新知