假设我们有一个具有分层架构的应用程序。在视图上我们使用 MVC 或 MVVM。模型被视为域,它有很好的业务逻辑部分。
现在假设我们在模型中有一个需要一些时间的方法。例如,必须对对象的每个项目进行复杂的计算或处理。
在 UI 中,我们希望显示一个进度条和一个显示当前计算步骤的文本(例如包含所有过程历史记录的列表框)。
你会怎么做?如何从模型发送流程进度信息以及如何连接 Controller 或 ViewModel 以便更新进度?
我经常通过以下方式实现这一点。我的业务层流程需要很长时间才能运行,经常会引发事件以表明它正在达到特定的“里程碑”。您可以决定通过事件来表明哪些里程碑以及事件的数量。例如,如果您的耗时过程是一个简单的循环,您可以选择在循环中每 10% 的项目一次又一次引发相同的事件。如果这是一个具有不同阶段的流程,您可以选择在每个阶段完成时引发不同的事件。
现在,您的表示层订阅这些事件并相应地执行操作,更新进度条、文本或其他内容。
这个机制很好,因为:
- 业务层独立于表示层中可能发生的事情。
- 很容易扩展双向通信。您可以轻松地更改事件,以便表示层(或任何其他订阅者)可以返回取消标志,以便业务层知道必须取消长时间运行的流程。
- 它允许同步或异步工作。也就是说,您可以在阻塞调用(即您的表示层和业务层共享同一线程)或非阻塞调用(即您的业务层使用后台工作线程)上使用它。这System.ComponentModel.BackgroundWorker http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspxclass 可以在后一种情况下使用,但如果您想引发多种类型的事件,则不太好。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)