begininvoke和control.Begininvoke的区别(利用委托来说明begininvoke调用委托的去区别)

本文介绍了C#中的委托概念,包括其在事件处理、回调函数和多播委托中的应用,以及通过实例展示了如何创建委托、绑定事件和调用委托。还对比了BeginInvoke和Control.BeginInvoke的区别。
摘要由CSDN通过智能技术生成

1.什么是委托

C#中的委托是一种类型,它可以用来引方法。使用委托的主要目的是实现事件处理、回调函数和多播委托等功能。委托提供了一种灵活的方式来处理方法的引用,使得代码更加模块化和可扩展。

委托的使用意义如下:

  1. 实现事件处理:委托可以用来定义和触发事件。通过将方法绑定到委托上,当事件发生时,可以调用委托来执行相应的方法,实现事件的处理逻辑。
  2. 实现回调函数:委托可以作为参数传递给其他方法,使得这些方法可以在需要时调用委托所引用的方法。这样可以实现回调函数的功能,即在某个条件满足时,调用指定的方法。
  3. 实现多播委托:委托可以引用多个方法,通过使用"+"运算符将多个方法绑定到同一个委托上。当调用委托时,会依次执行所有绑定的方法。这样可以实现一次性调用多个方法的需求。

总结来说,使用委托可以提高代码的灵活性和可复用性,使得程序结构更加清晰和模块化。同时,委托还可以简化事件处理和回调函数的实现,提高代码的可读性和可维护性。

2.委托实例 -创建委托和实现委托

这里的委托仅限于Delggate委托

1.委托和事件是分不开的,有委托就要用到事件

2.事件的调用

1).直接事件调用;

首先:首先将创建的事件绑定函数;绑定事件的方法可以分为两种:+=;new;

其次:在需要使用函数的时候,直接调用事件;
2).Invoke或者BeginInvoke调用委托;

具体代码如下:

 //委托,事件,使用自定义事件
        //定义委托
        public delegate void Dgtest(string name);
        //定义事件:事件分为自定义事件和event事件
        public event Dgtest EventTest;
        
        public Dgtest CustromTest;

        private void Form1_Load(object sender, EventArgs e)
        {
            EventTest += TestOne;
           
            CustromTest += TestTwo;
        }

        private void TestTwo(string name)
        {
            textBox1.Text = name;
            
        }

        private void TestOne(string name)
        {
            textBox1.Text = name;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            EventTest("我是EvetTest测试"+Thread.CurrentThread.ManagedThreadId);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            EventTest("我是ComtusTest测试" + Thread.CurrentThread.ManagedThreadId);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            CustromTest = new Dgtest(TestOne);
            CustromTest.Invoke("invoke"+ Thread.CurrentThread.ManagedThreadId);
           // this.Invoke(new Action(() => { TestOne("111"); }));
        }

        private void button4_Click(object sender, EventArgs e)
        {
            CustromTest = new Dgtest(TestOne);
          // CustromTest.BeginInvoke("111"+"线程"+ Thread.CurrentThread.ManagedThreadId, null,null);//线程间操作无效
          //this.BeginInvoke就是control.Begininvoke是在创建控件的基础句柄所在线程上执行的异步
           // this.BeginInvoke(new Action(() => { TestOne("111"+ Thread.CurrentThread.ManagedThreadId); }));
        }
    

3.begininvoke和control.Begininvoke使用的区别

在上述代码中也就是button4-click事件中:

使用this.begininvoke:就是control.Begininvoke是在创建控件的基础句柄所在线程上执行的异步,就是说创建控件和此bengininvoke使用的线程是同一线程;

使用beginInvoke:就是创建一个线程,在此线程上操作控件,和控件所在线程不一致,会导致线程操作无效;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄荷撞~可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值