如果我们异步调用的是一个带有返回值的方法的话,那么该怎么操作呢?
下面介绍一下有关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()不会执行,会等待异步调用结束后才继续执行。
相关代码如下: