如何从业务/模型类发送进度更新?

Gim*_*mly 9 architecture model-view-controller mvvm

假设我们有一个具有分层架构的应用程序.在视图中我们使用MVC或MVVM.该模型被视为域,它具有很好的业务逻辑部分.

现在让我们假设我们在模型中有一个需要一些时间的方法.例如,必须对对象的每个项目进行复杂的计算或处理.

在UI中,我们希望显示进度条和显示当前计算步骤的文本(例如,包含所有过程历史记录的列表框).

你会怎么做?如何从模型中发送进程进度信息以及如何连接Controller或ViewModel以便更新进度?

Ces*_*Gon 6

我经常以下面的方式实现这一点.我的业务层流程需要很长时间才能运行,每隔一段时间就会引发事件,以表明它正在达到特定的"里程碑".您可以决定通过事件发出信号的里程碑以及有多少里程碑.如果您的耗时过程是一个简单的循环,您可以选择,例如,循环中每10%的项目一次又一次地引发相同的事件.如果它是具有不同阶段的过程,您可以选择在每个阶段完成时引发不同的事件.

现在,您的表示层会订阅这些事件并执行相应的操作,更新进度条,文本或其他内容.

这种机制很好,因为:

  1. 业务层保持独立于表示层中可能出现的内容.
  2. 它易于扩展以进行双向通信.您可以轻松地更改事件,以便表示层(或任何其他订户)可以返回取消标记,以便业务层知道必须取消长时间运行的进程.
  3. 它承认同步或异步工作.也就是说,您可以在阻止调用(即您的演示文稿和业务层共享相同的线程)或非阻塞调用(即您的业务层使用后台工作线程)上使用它.该System.ComponentModel.BackgroundWorker类可以在后一种情况下可以使用,但如果你想提高多种类型的事件,这不是太佳.

希望这可以帮助.