如何处理MVC中长时间运行的模型计算?

时间:2009-09-28 12:48:35

标签: model-view-controller

我正在编写一个准MVC风格的应用程序。它有一个GUI,一个控制器和一个后端,处理所有的计算和数据访问和东西。这很偶然发生,我对MVC没有任何经验,但我想更彻底地理解它。

因此,该模型必须进行一些冗长的计算。如何在传统的MVC方法中处理这个问题?我的方法是在自己的线程中生成长计算(以便不阻止GUI)并让控制器定期查询它的当前状态,以便它知道何时更新GUI。

在另一种情况下,模型正在播放并录制一些音频。这属于模型吗?模型应该主动告诉控制器它正在做什么,还是应该保持被动状态并定期查询?

4 个答案:

答案 0 :(得分:3)

在我看来,民意调查应始终是最后的解决方案。为什么不让您的模型发出进度事件并订阅它们?

答案 1 :(得分:1)

我猜这里要做什么(移植到DSP?真的吗?我想你的意思是长时间运行的过程)是你应该让模型成为数据和元数据。让一个线程成为长时间运行的控制器,它会更新数据和元数据。您的gui线程是其他控制器,当需要构建视图时,将查看数据和元数据并为视图进行争论。元数据可以是长时间运行的转换或过程的当前状态,也可以包括播放头和记录头的位置。

答案 2 :(得分:1)

如果您正在考虑纯粹的面向推送的MVC方法,那么信息路径应该是:

C→M→V

并在每个组件之间推送一条具有不同语义字段的消息;通常在GUI应用程序中它是这样的:

  1. 捕获GUI事件并调用Controller拥有的回调。
  2. Controller将GUI面向事件的语义转换为带参数的Model命令。
  3. 执行模型命令,将相关视图询问(a)update()或(b)update(data)
  4. 使用(a),View必须轮询模型以获取信息。如果可以避免,我不建议这样做,因为它会在视图和模型之间产生紧密耦合。

    使用(b),视图的update()方法有一个data参数,足以让视图执行更新。

    在我看来,最好的解决方案是:

    让您的模型根据控制器事件(或消息)实例化计算线程。然后让计算线程通知模型其进度。实际上,模型可能有兴趣根据计算线程的进度/状态进行一些处理。

    当模型想要通知其视图时(根据计算的进度或其他状态依赖性,这些视图可能不是相同的视图),让它通知您需要发送它们的任何模型信息的感兴趣的视图。 / p>

    如果您的视图需要进行一些GUI渲染,根据您的GUI工具包线程安全性,您可能需要在视图更新中使用延迟渲染方法。

    模型和视图之间的一个方便的通信总线是Observable / Observer。您也可以执行直接调用(这会在模型和视图之间创建紧密耦合)。

答案 3 :(得分:-1)

如果您的业务逻辑需要很长时间进行处理,您可以使用多种技术来实现目标: 您可以尝试在Actions中使用Tasks和async。 要么 您可以使用WCF双工调用,它将在完成后返回异步结果 要么 你可以尝试使用SignalR