• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C# 委托随笔

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

     

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的异步回调。

    


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c++中的隐藏及重载、重写与隐藏的区别发布时间:2022-07-13
下一篇:
C++#include—尖括号和双引号的区别发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap