异步编程--回调模式

异步编程
如果委托对象在调用列表中只有一个方法(引用方法),在调用委托类中的BeginInvoke方法时,它开始在一个独立的线程上执行引用方法,并且立即返回到原始线程。原始线程可以继续,而引用方法会在线程池中的线程中执行。

回调模式:
一旦原始线程发起了异步方法,它就自己管自己,不再考虑同步。当异步方法调用结束后,系统直接调用用户自定义的方法(回调方法)处理结果。

BeginInvoke的参数列表中的最后两个参数
第一: 回调方法(callback)
第二: state,可以回调方法传入一个对象的引用,通过IAsyncResult参数的AsyncState属性来获取这个对象。

以下代码演示如何使用这两个参数,来获取异步方法的结果
通过IAsyncResult.AsyncState提取委托的引用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AsyncTestdf39
{
    class Program
    {
        delegate long MyDel(int i1, int i2);
        static void Main(string[] args)
        {

            MyDel del3 = new MyDel(Sum);

            Console.WriteLine("before beginInvoke");


            IAsyncResult iar2 = del3.BeginInvoke(90, 12, callWhenDone, del3);//将del3对象传给回调方法

            Console.WriteLine("doing more work in main");

            System.Threading.Thread.Sleep(200);
            Console.WriteLine("done with Main , Exiting..");
            Console.ReadLine();
        }
        static void callWhenDone(IAsyncResult iar)
        {
            Console.WriteLine("                                inside CallWhenDone");
            object de = iar.AsyncState;//获取委托对象的引用
            MyDel deleg = (MyDel)de; //转换为委托类型

            Console.WriteLine("result: {0}", deleg.EndInvoke(iar));
        }
        static long Sum(int i1, int i2)
        {
            Console.WriteLine("                                inside Sum");

            System.Threading.Thread.Sleep(100);
            return i1 + i2;
        }
    }
}

运行结果

这里写图片描述

通过IAsyncResult提取委托的引用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Remoting.Messaging;//引用AsyncResult类命名空间

namespace AsyncTestdf39
{
    class Program
    {
        delegate long MyDel(int i1, int i2);
        static void Main(string[] args)
        {

            MyDel del3 = new MyDel(Sum);

            Console.WriteLine("before beginInvoke");

           IAsyncResult iar2 = del3.BeginInvoke(90, 12, callWhenDone, null);
         //  IAsyncResult iar2 = del3.BeginInvoke(90, 12, callWhenDone, del3);//将del3对象传给回调方法
            Console.WriteLine("doing more work in main");

            System.Threading.Thread.Sleep(200);
            Console.WriteLine("done with Main , Exiting..");
            Console.ReadLine();
        }
        static void callWhenDone(IAsyncResult iar)
        {
            Console.WriteLine("                                inside CallWhenDone");
            //object de = iar.AsyncState;//获取委托对象的引用
            //MyDel deleg = (MyDel)de; //转换为委托类型  
            AsyncResult iads = (AsyncResult)iar;
            MyDel deleg = (MyDel)iads.AsyncDelegate;//通过IAsyncResult提取委托的引用
            Console.WriteLine("result: {0}", deleg.EndInvoke(iar));
        }
        static long Sum(int i1, int i2)
        {
            Console.WriteLine("                                inside Sum");

            System.Threading.Thread.Sleep(100);
            return i1 + i2;
        }
    }
}

运行结果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值