在超长时间调用时,如果采用同步调用,因为窗口的Windows消息循环被阻塞,会造成界面出现假死或卡死的状态。
为了避免窗口出现假死状态,通常采用异步调用,利用定时器周期性的泵入消息到主窗口,提示操作执行的进度。同时为了优雅的取消长时间的操作,需要提供对应的异步操作取消操作处理。主窗口中应该可以同时发起多个异步操作,相互之间互不干涉。
基于以上的处理需求,编写了异步处理调用窗口基类。
每一个具体的调用,通过匿名委托拆分成两部分,异步调用处理部分和同步界面显示部分,对应的调用引用,统一送入上下文处理调用接口,构建完毕异步调用上下文之后,被系统抛入线程池,同时放入同步上下文链表中。抛入线程池的调用构造,被重新分发给独立的消息处理线程,每一个消息处理线程,与异步调用上下文关联,可以利用异步调用上下文,破坏消息处理线程对应的线程栈,达到异步操作取消的目的。正常的处理消息,在消息处理线程被处理,本质上是调用的函数引用,处理完毕之后,通过同步处理上下文,将处理完毕的结果抛回UI线程,包括正常处理结果或异步处理结果,UI线程负责加载显示处理完毕的结果。
最后由调度类,释放消息处理线程,界面等待显示窗口,定时器等。
整个调度的序列图,如下,Demo下载地址:http://download.csdn.net/detail/gongbenwen/9627785
异步调用效果图: