在异步程序中,程序代码不需要严格按照编写时的顺序执行
为了改善代码性能,有时候需要在一个新的线程中运行一部分代码
有时候无需创建新的线程,但为了更好的利用单个线程的能力,需要改变代码的执行顺序
也就是说:
异步编程赋予代码非顺序执行的能力,让程序能够在部分耗时操作的同时,干其他的事情
一、通过委托实现异步
如果委托对象在调用列表中只有一个方法(引用方法),它就可以异步执行这个方法
委托类有 BeginInvoke,EndInvoke 方法,可以用以下方式使用:
- 当调用 BeginInvoke 方法时,它开始在一个独立线程上执行引用方法,并立即返回到原始线程;原始线程可以继续运行,而引用方法会在线程池大的线程中并行执行
- 当程序希望获取已完成的异步方法的结果时,可以检查 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性,或者调用 EndInvoke 方法等待委托的完成
使用这一过程有三种标准模式,区别在于:原始线程如何知道发起的线程已经完成
- 一直等待到完成模式(wait until done):
原始线程发起异步方法并做了一些其他处理后,原始线程中断并等待异步方法完成后再继续
- 轮询模式(polling):
原始线程定期检查发起的异步方法线程是否完成,如果没有则继续做其他事情
- 回调模式(callback):
原始线程一直执行,无需等待,当发起的线程中引用方法完成后,发起的线程就调用回调方法,调用 EndInvoke 之前处理异步方法的结果