zoukankan      html  css  js  c++  java
  • C#(99):委托Delegate

    一、概述

    委托为引用类型

    二、使用

    1、声明委托类型,定义委托

    public delegate void HandlerDelegate(string message);

    2、声明委托变量

    HandlerDelegate myDelegate;//声明委托变量

    3、实例化委托,带函数引用

    传统方式

    //myDelegate = new HandlerDelegate(Method1);//可以为静态方法或者实例方法。
        //或者直接myDelegate = Method1;

    方法定义:

    public void Method1(string mgs)
    {
        Console.WriteLine(mgs);
    }

    或匿名方法方式:

    myDelegate = delegate (string message)//实例化委托(带函数引用)
    {
        Console.WriteLine(message);
    };

    或lambda表达式方式:

    myDelegate = (message) => { Console.WriteLine(message); };

    4、调用委托

    myDelegate("Hello World");//同步调用

    三、高级用法

    1、多播委托

    public delegate void HandlerDelegate(string message);
    
    void Main()
    {
        HandlerDelegate myDelegate;//声明委托变量
        myDelegate = (message) => { Console.WriteLine("a " + message); };
        myDelegate += (message) => { Console.WriteLine("b " + message); };
        myDelegate += (message) => { Console.WriteLine("c " + message); };
        myDelegate("Hello World");//多个方法依次调用
        Console.WriteLine(myDelegate.GetInvocationList().GetLength(0));//3
    }

    2、作为方法的参数传递委托实例

    public delegate void HandlerDelegate(string message);
    
    //客户端
    void Main()
    {
        HandlerDelegate myDelegate;//声明委托变量
        myDelegate = (message) =>
        {
            Console.WriteLine("计算结果为:" + message);
        };
    
        MyClass myClass = new MyClass();
        myClass.MethodWithCallback(2, myDelegate);
    }
    
    
    //作为服务端,计算完成后,将结果返回给客户端
    public class MyClass
    {
        public void MethodWithCallback(int a, HandlerDelegate callback)
        {
            a = a + 1;
            callback("result:" + a.ToString());//执行委托
        }
    }

    四、同步、异步调用

    1、委托的同步调用

    委托的Invoke方法用来同步调用,它将阻塞当前线程,然后执行调用线程,调用完毕后再继续主线程向下执行。

    public delegate int AddHandler(int a, int b);
    
    void Main()
    {
        AddHandler handler = (a, b) =>
        {
            return (a + b);
        };
        //int result = handler(2, 3);
        int result = handler.Invoke(2, 3);//此句调用的方法执行完毕后才执行往下的语句。
        Console.Write(result);//5
    }

    2、委托的异步调用

    把调用放入线程池中,程序主体线程或UI线程可同时执行。

    public delegate int AddHandler(int a, int b);
    
    void Main()
    {
        AddHandler handler = (a, b) =>
        {
            return (a + b);
        };
    
        IAsyncResult ar = handler.BeginInvoke(2, 3, null, null);
    
        //while (!ar.IsCompleted)
        //{
        //     Console.WriteLine("Do Sth.");//在委托的工作未完成之前,主线程可做其他事情。
        //}
        //
        while (!ar.AsyncWaitHandle.WaitOne(0, false))
        {
            Console.WriteLine("Do Sth.");
        }
    
        int result = handler.EndInvoke(ar);
        Console.Write(result);//5
    }

    3、委托的异步回调

    public delegate int AddHandler(int a, int b);
    
    void Main()
    {
        AddHandler handler = (a, b) =>
        {
            return (a + b);
        };
    
        IAsyncResult ar = handler.BeginInvoke(2, 3, new AsyncCallback(AddComplete), null);
        Console.WriteLine("Do Sth.");//异步调用完成时调用此方法。
    
    }
    public void AddComplete(IAsyncResult ar)
    {
        AddHandler handler = ((AsyncResult)ar).AsyncDelegate as AddHandler;
        Console.WriteLine(handler.EndInvoke(ar));
    }

    另外,请参考:异步编程模型AMP

  • 相关阅读:
    【读书笔记-《Android游戏编程之从零开始》】2.Hello,World!
    【读书笔记-《Android游戏编程之从零开始》】1.Android 平台简介与环境搭建
    .Net HttpClient 模拟登录微信公众平台发送消息
    C# DateTime的ToString()方法的使用
    SQL 2008R2 日期转换
    Dojo学习(一)—Hello Dojo
    【博客开篇】服务器配置:Windows2008R2+PHP5.6+SQLServer2008(X64)
    【翻译Autofac的帮助文档】1.入门指南
    申请免费的SSL证书(Win7,PowerShell,Let's Encrypt)
    Rms操作设置office系统文档权限
  • 原文地址:https://www.cnblogs.com/springsnow/p/9428530.html
Copyright © 2011-2022 走看看