闲着没事,写个委托、异步委托玩玩

时间:2022-05-01 18:57:11
在编程中,委托有利于解耦,同时也是异步编程的基础,但是由于书写的方式跟平常不太一样,所以委托就跟反射一样,比较难于接受。

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值,委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。

与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。只要知道委托的签名,便可以分配自己的委托方法。

将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。例如,可以向排序算法传递对比较两个对象的方法的引用。分离比较代码使得可以采用更通用的方式编写算法。

委托具有以下特点:

  • 委托类似于 C++ 函数指针,但它是类型安全的。

  • 委托允许将方法作为参数进行传递。

  • 委托可用于定义回调方法。

  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。

  • 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。

  • C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。



以下,为委托与异步委托的实例代码:

闲着没事,写个委托、异步委托玩玩using  System;
闲着没事,写个委托、异步委托玩玩
using  System.Collections.Generic;
闲着没事,写个委托、异步委托玩玩
using  System.Text;
闲着没事,写个委托、异步委托玩玩
闲着没事,写个委托、异步委托玩玩
namespace  TestWindowsApplication
闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩
{
闲着没事,写个委托、异步委托玩玩    
public class Maths
闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩    
{
闲着没事,写个委托、异步委托玩玩        
public int add(int x, int y)
闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        
{
闲着没事,写个委托、异步委托玩玩            
return x + y;
闲着没事,写个委托、异步委托玩玩        }

闲着没事,写个委托、异步委托玩玩
闲着没事,写个委托、异步委托玩玩        
public int minus(int x, int y)
闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        
{
闲着没事,写个委托、异步委托玩玩            
return x - y;
闲着没事,写个委托、异步委托玩玩        }

闲着没事,写个委托、异步委托玩玩    }

闲着没事,写个委托、异步委托玩玩}

闲着没事,写个委托、异步委托玩玩

  1 闲着没事,写个委托、异步委托玩玩using  System;
  2 闲着没事,写个委托、异步委托玩玩 using  System.Collections.Generic;
  3 闲着没事,写个委托、异步委托玩玩 using  System.ComponentModel;
  4 闲着没事,写个委托、异步委托玩玩 using  System.Data;
  5 闲着没事,写个委托、异步委托玩玩 using  System.Drawing;
  6 闲着没事,写个委托、异步委托玩玩 using  System.Text;
  7 闲着没事,写个委托、异步委托玩玩 using  System.Windows.Forms;
  8 闲着没事,写个委托、异步委托玩玩
  9 闲着没事,写个委托、异步委托玩玩 namespace  TestWindowsApplication
 10 闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩 {
 11闲着没事,写个委托、异步委托玩玩    public partial class Form1 : Form
 12闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩    {
 13闲着没事,写个委托、异步委托玩玩        //定义一个委托
 14闲着没事,写个委托、异步委托玩玩        public delegate int MyHandler(int x, int y);
 15闲着没事,写个委托、异步委托玩玩
 16闲着没事,写个委托、异步委托玩玩        public Form1()
 17闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        {
 18闲着没事,写个委托、异步委托玩玩            InitializeComponent();
 19闲着没事,写个委托、异步委托玩玩        }

 20闲着没事,写个委托、异步委托玩玩
 21闲着没事,写个委托、异步委托玩玩        private void Form1_Load(object sender, EventArgs e)
 22闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        {
 23闲着没事,写个委托、异步委托玩玩
 24闲着没事,写个委托、异步委托玩玩        }

 25闲着没事,写个委托、异步委托玩玩
 26闲着没事,写个委托、异步委托玩玩        private void button1_Click(object sender, EventArgs e)
 27闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        {
 28闲着没事,写个委托、异步委托玩玩            int x = this.textBox1.Text == "" ? 0 : int.Parse(this.textBox1.Text);
 29闲着没事,写个委托、异步委托玩玩            int y = this.textBox2.Text == "" ? 0 : int.Parse(this.textBox2.Text);
 30闲着没事,写个委托、异步委托玩玩
 31闲着没事,写个委托、异步委托玩玩            Maths maths = new Maths();
 32闲着没事,写个委托、异步委托玩玩            //绑定到maths实例的add方法
 33闲着没事,写个委托、异步委托玩玩            MyHandler addhandler = new MyHandler(maths.add);
 34闲着没事,写个委托、异步委托玩玩            //调用
 35闲着没事,写个委托、异步委托玩玩            int addResult = addhandler(x, y);
 36闲着没事,写个委托、异步委托玩玩            MessageBox.Show(string.Format("{0} values: {1}", addhandler.Method.Name, addResult));
 37闲着没事,写个委托、异步委托玩玩        }

 38闲着没事,写个委托、异步委托玩玩
 39闲着没事,写个委托、异步委托玩玩        private void button2_Click(object sender, EventArgs e)
 40闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        {
 41闲着没事,写个委托、异步委托玩玩            int x = this.textBox1.Text == "" ? 0 : int.Parse(this.textBox1.Text);
 42闲着没事,写个委托、异步委托玩玩            int y = this.textBox2.Text == "" ? 0 : int.Parse(this.textBox2.Text);
 43闲着没事,写个委托、异步委托玩玩
 44闲着没事,写个委托、异步委托玩玩            StringBuilder sb = new StringBuilder();
 45闲着没事,写个委托、异步委托玩玩            Maths maths = new Maths();
 46闲着没事,写个委托、异步委托玩玩
 47闲着没事,写个委托、异步委托玩玩            MyHandler all = null;
 48闲着没事,写个委托、异步委托玩玩            //绑定到maths实例的add方法
 49闲着没事,写个委托、异步委托玩玩            MyHandler add = new MyHandler(maths.add);
 50闲着没事,写个委托、异步委托玩玩            //绑定到maths实例的minus方法
 51闲着没事,写个委托、异步委托玩玩            MyHandler minus = new MyHandler(maths.minus);
 52闲着没事,写个委托、异步委托玩玩
 53闲着没事,写个委托、异步委托玩玩            //链接
 54闲着没事,写个委托、异步委托玩玩            all += add;
 55闲着没事,写个委托、异步委托玩玩            all += minus;
 56闲着没事,写个委托、异步委托玩玩
 57闲着没事,写个委托、异步委托玩玩            //定义传入参数
 58闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩            object[] param ={ x, y };
 59闲着没事,写个委托、异步委托玩玩
 60闲着没事,写个委托、异步委托玩玩            //获取目标委托数组
 61闲着没事,写个委托、异步委托玩玩            Delegate[] delegates = all.GetInvocationList();
 62闲着没事,写个委托、异步委托玩玩            foreach (Delegate dg in delegates)
 63闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩            {
 64闲着没事,写个委托、异步委托玩玩                try
 65闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩                {
 66闲着没事,写个委托、异步委托玩玩                    //动态调用当前委托所表示的方法
 67闲着没事,写个委托、异步委托玩玩                    int addResult = (int)dg.DynamicInvoke(param);
 68闲着没事,写个委托、异步委托玩玩                    sb.AppendFormat("{0} values: {1}\n", dg.Method.Name, addResult);
 69闲着没事,写个委托、异步委托玩玩                }

 70闲着没事,写个委托、异步委托玩玩                catch (Exception et)
 71闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩                {
 72闲着没事,写个委托、异步委托玩玩                    MessageBox.Show(et.Message);
 73闲着没事,写个委托、异步委托玩玩                }

 74闲着没事,写个委托、异步委托玩玩            }

 75闲着没事,写个委托、异步委托玩玩
 76闲着没事,写个委托、异步委托玩玩            MessageBox.Show(sb.ToString());
 77闲着没事,写个委托、异步委托玩玩        }

 78闲着没事,写个委托、异步委托玩玩
 79闲着没事,写个委托、异步委托玩玩        private void button3_Click(object sender, EventArgs e)
 80闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩        {
 81闲着没事,写个委托、异步委托玩玩            int x = this.textBox1.Text == "" ? 0 : int.Parse(this.textBox1.Text);
 82闲着没事,写个委托、异步委托玩玩            int y = this.textBox2.Text == "" ? 0 : int.Parse(this.textBox2.Text);
 83闲着没事,写个委托、异步委托玩玩
 84闲着没事,写个委托、异步委托玩玩            Maths maths = new Maths();
 85闲着没事,写个委托、异步委托玩玩            //绑定到maths实例的add方法
 86闲着没事,写个委托、异步委托玩玩            MyHandler addhandler = new MyHandler(maths.add);
 87闲着没事,写个委托、异步委托玩玩
 88闲着没事,写个委托、异步委托玩玩            //异步调用开始
 89闲着没事,写个委托、异步委托玩玩            IAsyncResult ar = addhandler.BeginInvoke(x, y, nullnull);
 90闲着没事,写个委托、异步委托玩玩
 91闲着没事,写个委托、异步委托玩玩            //异步操作是否完成
 92闲着没事,写个委托、异步委托玩玩            while (!ar.IsCompleted)
 93闲着没事,写个委托、异步委托玩玩闲着没事,写个委托、异步委托玩玩            {
 94闲着没事,写个委托、异步委托玩玩                //如果没完成,当前线程阻止时间为10毫秒
 95闲着没事,写个委托、异步委托玩玩                System.Threading.Thread.Sleep(10);
 96闲着没事,写个委托、异步委托玩玩            }

 97闲着没事,写个委托、异步委托玩玩            //异步调用完成,返回结果
 98闲着没事,写个委托、异步委托玩玩            int addResult = addhandler.EndInvoke(ar);
 99闲着没事,写个委托、异步委托玩玩
100闲着没事,写个委托、异步委托玩玩            MessageBox.Show(string.Format("{0} values: {1}", addhandler.Method.Name, addResult));
101闲着没事,写个委托、异步委托玩玩        }

102闲着没事,写个委托、异步委托玩玩
103闲着没事,写个委托、异步委托玩玩    }

104闲着没事,写个委托、异步委托玩玩}