[2014-9-10]异步编程
异步编程
启用一个应用程序,系统在内存中创建一个新的进程,进程是一组资源,包括虚拟地址控件,文件句柄和程序启动所需要其他载体。
进程中创建一个线程内核对象,线程体现了程序的真实执行情况。
默认情况下,一个进程包括一个线程,从程序的开始一直到程序的结束。
线程池(thread pool)
刚开始,进程的线程池为空,进程使用的线程被创建,并且完成了线程的执行,它不会销毁,而是加入到进程的线程池中。如果进程需要另外一个线程,CLR会从池中还原一个线程,节省时间。
异步编程模式
1.等待-直到完成,原始线程中断并等异步方法完成在继续
2.轮询,原始线程定期检查发起线程是否完成,如没有,可继续做其他。
3.回调
BeginInvoke从线程池中获取一个线程并在新的线程开始时运行引用方法。返回给调用线程一个实现IAsyncResult接口的对象,这个接口引用包含了
异步方法当前状态,原始线程可继续执行。
EndInvoke 获取由异步方法调用返回的值,并释放线程使用的资源。接受一个由BeginInvoke返回的IAsyncResult对象的引用,找到关联线程
等待-直到结束模式
原始线程发起一个异步方法的调用,做一些其他处理,然后停止并等待,直到开启线程结束。
IAsyncResult isa = del.BeginInvoke(3,5,null,null)
long result = del.EndInvoke(iar)
轮询模式
原始线程发起异步方法的调用,然后使用IAsyncResult对象的IsComplete属性定期检查开启的线程是否完成,如果异步方法已经完成,原始线程调用EndInvoke.
回调模式
等待直到结束模式和轮询模式中,初始线程继续自己的流程,知道它开启的线程完成。
回调模式不同在于,一旦初始线程发起异步方法,它就自己管自己,不再考虑同步,当异步方法结束,系统调用一个用户自定义方法来处理结果,并调用委托的EndInvoke方法
这个用户自定义的方法叫做回调方法
void AsyncCallBack(ISyncResult iar)
IAsyncResult iar1=(del.BeginInvoke(3,5,new AsyncResult(),null))