目的:对于以交互式的用户界面而言,假如要调用长时间运行的操作,那么可以使用以下模式让你的调用更方便。
问题:某个用户界面必须多次启动某个操作,开发人员希望将其从该接口的操作中分开。这里面可能有很多的理由,但最普遍的情形是多个操作需要被立即执行,或某个操作潜在地占用过多的时间,超过了用户所期望的等待响应时间。某写操作的完成总是要占用时间,在等待某个操作护照或者多个操作在后台执行时,用户界面应该允许用户继续做其他事情。对于web上的操作,现在流行的AJAX热得一塌糊涂,通过异步调用来获取服务器端信息并更新客户端。对于winform来说,当然也可以进行异步调用了。本文试图提供一个稍微通用一点的解决方法。
适用性: 在下列情况下可以使用: 采用胖客户端,WinForm实现。 操作被预期是长期的或者占用时间比较长的 多个操作必须立即被处理执行的 主要包括: public delegate void CompleteEvent<T>(T t); //采用泛型委托,操作的结果被传递给调用方。 public delegate void ExceptionEvent(Exception ExceptionThrown); //异常将被传递给调用方 public NotifyingThreadManager<T> //通知线程管理 NotifyingThreadManager<T> 中 public void ExecuteAsync(System.Windows.Forms.Control ControlToNotify, CompleteEvent<T> NotificationDelegate, ExceptionEvent ExceptionDelegate) 的目标就是存储需要用来通知的信息和启动封装线程的执行。我们需要知道将要同步的控件以及用来处理结果的两个委托。 线程的主要工作在 protected void DoExecution()中完成,可以进行相应的修改以适应实际操作。