(十)异步-委托异步调用(4)

一、委托异步执行

当委托对象被调用时,它调用其调用列表中包含的方法。这是同步完成的。

如果委托对象在调用列表中只有一个方法(引用方法),它就可以异步执行这个方法。委托类有两个方法,叫作 BeginInvoke 和 EndInvoke。

  • 当调用委托的 BeginInvke 方法时,它开始在一个独立线程上执行引用方法,之后立即返回到原始线程。原始线程可以继续,而引用方法会在线程池的线程中并行执行。

  • 当程序希望获取已完成的异步方法的结果时,可以检查 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性,或调用委托的 EndInvoke 方法来等待委托完成。

原始线程如何知道发起的线程已经完成:

  • 在等待直到完成(wait-until-done)模式中,在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续。

  • 在轮询(polling)模式中,原始线程定期检查发起的线程是否完成,如果没有则可以继续做一些其他的事情。

  • 在回调(callback)模式中,原始线程一直执行,无须等待或检查发起的线程是否完成。

在发起的线程中的引用方法完成之后,发起的线程就会调用回调方法,由回调方法在调用 EndInvoke 之前处理异步方法的结果。

原始线程是操作系统内核在创建进程时创建的第一个线程。

请添加图片描述

二、BeginInvoke 和 EndInvoke

BeginInvoke:

  • 在调用 BeginInvoke 时,参数列表中的实际参数:

    • 引用方法需要的参数;
    • 两个额外的参数—— callback 参数和 state 参数。
  • BeginInvoke 从线程池中获取一个线程并且让引用方法在新的线程中开始运行。

  • BeginInvoke 返回给调用线程一个实现 IAsyncResult 接口的对象的引用。这个接口引用包含了在线程池线程中运行的异步方法的当前状态。然后原始线程可以继续执行。

delegate long MyDel(int first,int second);//委托声明
...
static long Sun(int x,int y){ return x + y; }//方法匹配委托
...
MyDel del = new MyDel(Sum);//创建委托对象

IAsyncResult iar = del.BeignInvoke(3,5,null,null);

//IAsyncResult iar:有关新线程的信息
//del.BeignInvoke:异步调用委托
//3,5:委托参数
//callback(null) 和 state(null):额外参数

//最后一行代码的程序执行步骤:
//1、从线程池中获取一个线程并且在新的线程上运行 Sum 方法,将3和5作为实参。
//2、它收集新线程的状态信息并且把 IAsyncResult 接口的引用返回给调用线程来提供这些信息。调用线程把它保存在一个叫作 iar 的变量中。

EndInoke 方法用来获取由异步方法调用返回的值,并且释放线程使用的资源。EndInvoke 有如下的特性。

  • 它接受一个由 BeginInvoke 方法返回的 IAsyncResult 对象的引用作为参数,并找到它关联的线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值