• 委托



    1

    委托 存放函数安全指针

    2 步骤
    /// <summary>
    /// 定义委托类型
    /// </summary>
    public delegate void DGSayHi(string name);
    /// <summary>
    /// 生明委托变量
    /// </summary>
    DGSayHi dgSayHi = null;
    //初始化委托
    dgSayHi = new DGSayHi(SayHi);

    //委托追加方法
    dgSayHi += SayHi2;// dgSayHi=(DGSayHi)Delegate.Combine(dgSayHi, SayHi2);
    //w委托移除方法
    dgSayHi -= SayHi2;

    //调用
    dgSayHi("刘兴");
    //dgSayHi.Invoke("刘兴");内部其实是这样的

    3 异步调用委托
    ////1.异步调用委托
    //MyDelegate md = new MyDelegate(GetSum);

    ////开始异步调用委托
    //md.BeginInvoke(1, 30, null, null);
    //Console.WriteLine("主线程继续........");
    //Console.ReadKey();

    ////获取方法的返回值
    ////1.异步调用委托
    //MyDelegate md = new MyDelegate(GetSum);
    ////开始异步调用委托
    ////BeginInvoke()返回值就是返回了一个对象,这个对象实现了IAsyncResult接口,并且该对象中封装了一些关于当前异步执行的委托的一些状态信息。
    //IAsyncResult asyncResult = md.BeginInvoke(1, 30, null, null);
    //for (int i = 0; i < 10; i++)
    //{
    // Console.WriteLine("主线程继续执行.." + i);
    //}

    ////调用EndInvoke会阻塞线程,等待异步委托执行完毕。
    //int sum = md.EndInvoke(asyncResult);
    //Console.WriteLine("方法执行的返回值为:{0}", sum);
    //Console.WriteLine("主线程继续........");
    //Console.ReadKey();


    4
    异步调用委托 并且调用回调函数


    //=======异步调用委托中的回调问题======================
    MyDelegate md = new MyDelegate(GetSum);

    //开始异步调用委托
    IAsyncResult result = md.BeginInvoke(1, 30, new AsyncCallback(Callback),
    "Test");


    Console.WriteLine("主线程继续执行。。。。。");
    Console.ReadKey();
    }
    //该回调函数有系统自动调用,当指定的异步委托调用完毕后,自动调用该方法
    static void Callback(IAsyncResult syncResult)
    {

    Console.WriteLine("===================回调函数中的线程Id:{0}", Thread.CurrentThread.ManagedThreadId);
    //syncResult.AsyncState获取的就是BeginInvoke()中的最后一个参数。
    Console.WriteLine("回调函数的参数:{0}", syncResult.AsyncState);
    //在回调函数中调用EndInvoke()方法就可以获取返回值。

    //需要把接口类型转换为具体的对象
    AsyncResult ar = syncResult as AsyncResult;
    int sum = ((MyDelegate)ar.AsyncDelegate).EndInvoke(ar);
    Console.WriteLine("返回值是:{0}", sum);
    }

    static int GetSum(int n1, int n2)
    {
    Console.WriteLine("===================异步调用的函数GetSum中的线程Id:{0}", Thread.CurrentThread.ManagedThreadId);

    int sum = 0;
    for (int i = n1; i <= n2; i++)
    {
    sum += i;
    Thread.Sleep(100);
    }
    Console.WriteLine("方法中输出的结果:{0}", sum);
    return sum;
    }
    }
    public delegate int MyDelegate(int n1, int n2);

    ------黑 5
    5 微软定义的委托


    #region 泛型委托

    //Func<string> funDel = () => { return "ok"; };

    //Func<string, string> funDelDemo = (string s) => { return s + "sss"; };
    //Func委托微软提供了16个参数的重载,最后一个泛型的约束就是 返回值的类型。

    //Func都会有返回值
    //Func<string,int,string,bool>

    //Func<int,int,int> demoFunc = new Func<int, int, int>(AddFunc);


    //没有返回值的委托
    //Action<int,int>


    #endregion

  • 相关阅读:
    shell学习之杂项
    boot小知识
    记一个数组的问题
    lnmp安装exif扩展
    国内的Git比GitHub快
    重用思想,要有识别出好代码的眼睛,识别出腐朽代码的眼睛
    CSS3之超出隐藏
    如何测量设计图中图片的尺寸,像素
    Linux 软链接操作项目
    微信小程序申请。很蛋疼的流程。
  • 原文地址:https://www.cnblogs.com/cdaq/p/4618610.html
Copyright © 2020-2023  润新知