1.什么是委托
C#中的委托是一种类型,它可以用来引方法。使用委托的主要目的是实现事件处理、回调函数和多播委托等功能。委托提供了一种灵活的方式来处理方法的引用,使得代码更加模块化和可扩展。
委托的使用意义如下:
- 实现事件处理:委托可以用来定义和触发事件。通过将方法绑定到委托上,当事件发生时,可以调用委托来执行相应的方法,实现事件的处理逻辑。
- 实现回调函数:委托可以作为参数传递给其他方法,使得这些方法可以在需要时调用委托所引用的方法。这样可以实现回调函数的功能,即在某个条件满足时,调用指定的方法。
- 实现多播委托:委托可以引用多个方法,通过使用"+"运算符将多个方法绑定到同一个委托上。当调用委托时,会依次执行所有绑定的方法。这样可以实现一次性调用多个方法的需求。
总结来说,使用委托可以提高代码的灵活性和可复用性,使得程序结构更加清晰和模块化。同时,委托还可以简化事件处理和回调函数的实现,提高代码的可读性和可维护性。
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:就是创建一个线程,在此线程上操作控件,和控件所在线程不一致,会导致线程操作无效;