IASyncResult接口实现简单异步编程

我有一个梦想,是改变世界,这是很多技术人员的梦想;从小事做起,踏实做人做事,当身边的人或事因为自己能像更好的方向改变或发展的时候,那就是在改变世界,至花甲之时,可能我的梦想也无法实现,但我会一直追逐着他前行。我相信蝴蝶效应。荣耀的背后可这一道孤独。一起学习,一起进步。

1、异步编程是建立在委托基础上的编程方法
2、异步调用的每个方法都是在独立线程中执行的,因此本质上就是一种多线程程序。
3、比较适合在后台运行较为耗费时间的《简单任务》
4、如果后台任务要求必须按照特定顺序执行,或者访问特定的共享资源,则不适合使用异步编程,比较适合使用多线程编程。

下面的代码实现了不使用Thread,不使用Task实现异步编程
使用了IASyncResult接口和AsyncCallback委托
IASyncResult接口实现简单异步编程_第1张图片

class Program
{
        public delegate int AddDelegate(int num);
        public static void Main(string[] args)
        {
            Console.WriteLine("开始同步执行");
            Add1(10);
            Add2(20);
            Console.ReadLine();
            Console.WriteLine("开始异步编程了");
            AddDelegate addDel = Add2;
            //AsyncCallback委托要用的方法必须是IAsyncResult参数,该参数存了回调方法所需参数为object对象。
            AsyncCallback callBack = Add3;
            //IASyncResult参数1-N由自定义委托AddDelegate决定,AddDelegate有N个参数,那么就有N个参数
            //callback为AsyncCallback委托,可为null,最后一个参数表示回调函数的参数,该值被存在 re.AsyncState中(为object对象)
            IAsyncResult result = addDel.BeginInvoke(20, callBack, 10);
            Add1(10);
        //委托.EndInvoke(result)相当于一个监视器,一直在监视异步委托执行完成,一旦完成,则获取到结果并赋值到re中,与此同时会异步调用回调函数(有回调的情况下)。
            var re = addDel.EndInvoke(result);
            Console.WriteLine("Add2执行结果=" + re);
            Add1(1);
            Add1(5);
            Add1(10);
            Console.ReadLine();
        }

    public static int Add1(int a)
    {
        Console.WriteLine("开始ADD1");
        return a * a;
    }

    public static int Add2(int a)
    {
        Console.WriteLine("开始Add2");
        System.Threading.Thread.Sleep(5000);
        return a * a;
    }

    public static void Add3(IAsyncResult re)
    {
        var a = re.AsyncState;
        Console.WriteLine("执行回调=" + a);
    }
}

你可能感兴趣的:(NET高级,接口,服务)