zoukankan      html  css  js  c++  java
  • C# 委托随笔

           委托是指向函数的函数指针,而且是类型安全的。使用委托可以执行的一项有用操作是实现回调。回调是传入函数的方法,在函数结束执行时调用该方法。例如,有一个函数执行一个非常耗时的操作,在调用该函数时,同时也传入了一个回调方法(利用委托实现),从而在函数执行完成时,调用该回调方法,通知用户计算的结果。下面是一个用委托实现回调的示例:

         

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DelegateDemo
    {
        class Program
        {
            delegate void callBackdelegate(string strMessage);
            static void Main(string[] args)
            {
                callBackdelegate callback = ResultCallback;
                AddNumber(100, 200, callback);
                Console.ReadLine();
            }
            static void AddNumber(int num1, int num2,callBackdelegate callBack)
            {
                int result = num1 + num2;
                callBack("Result is : "+result.ToString());
            }
            static void ResultCallback(string strMessage)
            {
                Console.WriteLine(strMessage);
            }
        }
    }
    

      上面的示例只是同步回调,也就是说在执行函数AddNumber时(假设该函数执行很长时间),UI线程是会阻塞的,至到该函数执行完毕。这就给用户带来了不好的体验。其实我们在日常的软件开发中,用的最多的就是异步回调技术,该技术是指 在执行函数AddNumber时,UI线程不会阻塞。下面我们就用异步回调重写上面的示例:

         

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Remoting.Messaging;
    
    namespace DelegateDemo
    {
        class Program
        {
            //声明一个委托,签名与AddNumber函数相同
            delegate int MethodDelegate(int num1, int num2);
            static void Main(string[] args)
            {
                MethodDelegate del = AddNumber;
                AsyncCallback callback = new AsyncCallback(ResultCallBack);
    
                IAsyncResult result = del.BeginInvoke(100, 200, callback, null);
                Console.WriteLine("UI线程继续执行。。。。");
                Console.ReadLine();
            }
            static int AddNumber(int num1, int num2)
            {
                //用线程模拟一个耗时的操作
                System.Threading.Thread.Sleep(5000);
                return num1 + num2;
            }
            static void ResultCallBack(IAsyncResult ar)
            {
                //将ar强制转换为 AsyncResult 类型 该类型需引入命名空间System.Runtime.Remoting.Messaging
                MethodDelegate del = (MethodDelegate)((AsyncResult)ar).AsyncDelegate;
                int result = del.EndInvoke(ar);
                Console.WriteLine("The result is :" + result.ToString());
            }
        }
    }
    

       以上代码实现了对函数AddNumber的异步回调。

        

  • 相关阅读:
    Docker容器监控(十)--技术流ken
    Docker跨主机通信(九)--技术流ken
    Docker多主机管理(八)--技术流ken
    Docker公共&本地镜像仓库(七)--技术流ken
    Docker镜像构建的两种方式(六)--技术流ken
    Docker网络(五)--技术流ken
    tomcat使用详解(week4_day2)--技术流ken
    haproxy使用演示--技术流ken
    xshell连接虚拟机详解--技术流ken
    grafana使用详解--技术流ken
  • 原文地址:https://www.cnblogs.com/suxinlcq/p/1971030.html
Copyright © 2011-2022 走看看