C#同步和异步(五)带返回参数的异步调用

本文介绍了C#中使用BeginInvoke和EndInvoke进行带返回参数的异步调用。BeginInvoke用于在新线程中启动异步方法,返回IAsyncResult对象;EndInvoke则用于获取异步调用的结果,需要确保每个BeginInvoke都有对应的EndInvoke。当EndInvoke在异步调用未完成时调用,会导致线程阻塞。为解决此问题,可以将EndInvoke调用放入回调函数中。
摘要由CSDN通过智能技术生成

如果我们异步调用的是一个带有返回值的方法的话,那么该怎么操作呢?

下面介绍一下有关BeginInvoke()方法和EndInvoke()方法的相关内容和知识。

1、BeginInvoke方法

  • 在调用BeginInvoke时,参数列表中的实参组成如下:

    1)  引用方法需要的参数。主要和委托指向的实际调用的方法的参数有关

    2)  两个额外的参数——callback参数和state参数。

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

2、EndInvoke方法

  • 它接受一个由BeginInvoke方法返回的IasyncResult对象的引用,并找到它关联的线程。
  • 如果线程池的线程已经退出,EndInvoke做如下的事情。

    1)  它清理退出线程的状态并且释放它的资源。

    2)  它找到引用方法返回的值并且把它的值作为返回值。

  • 如果当EndInvoke被调用时线程池的线程仍然在运行,调用线程就会停止并等待,直到清理完毕并返回值。因为EndInvoke是为开启的线程进行清理,所以必须确保对每一个BeginInvoke都调用EndInvoke。
  • 如果异步方法触发了异常,在调用EndInvoke时会抛出异常。
  • 如果异步调用没有结束的话,EndInvoke()不会执行,会等待异步调用结束后才继续执行。

相关代码如下:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值