【问题标题】:WPF and Active ObjectsWPF 和活动对象
【发布时间】:2010-01-26 03:32:47
【问题描述】:

我有一个“活动对象”的集合。也就是说,需要定期更新自身的对象。反过来,这些对象应该用于更新基于 WPF 的 GUI。

在过去,我只会让每个对象都包含它自己的线程,但这仅在使用有限数量的具有明确定义的生命周期的对象时才有意义。现在我正在使用仅在表单需要时才存在的对象,因此生命周期是不可预测的。此外,我可以让数十个对象都进行数据库和 Web 服务调用。

正常情况下更新间隔为 1 秒,但由于超时,最长可能需要 30 秒。

那么,你会推荐什么设计?

【问题讨论】:

  • 是什么事件让您想要更新对象?
  • 基本上是某种形式的计时器,没有外部事件可以挂钩。

标签: wpf active-objects


【解决方案1】:

您可以为所有或一组活动对象使用一个调度程序(调度程序)。 Dispatcher 可以先处理高优先级的任务,然后再处理其他任务。 您可以查看article 关于长期运行的活动对象 的代码,了解如何执行此操作。另外,我建议查看半同步/半异步模式。 如果您有任何问题 - 欢迎。

【讨论】:

  • 什么是半同步/半异步模式?
  • 我认为,最好阅读这份文件 www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf。很快,我们就有了执行它们自己的任务(同步任务或用户进程)的活动对象和一些异步执行的外部任务(低事件或来自其他子系统的调用)。
【解决方案2】:

我不是专家,但我只想让对象触发一个事件,指示它们何时发生变化。然后,GUI 可以在收到事件时刷新自身的必要部分(使用数据绑定和 INotifyPropertyChanged 时很容易)。

【讨论】:

  • 这很简单。困难的部分是首先告诉对象何时更新自身,而无需某些用户点击刷新按钮。
  • 也许我不明白你的问题。不是每个对象都处理自己的刷新吗?每个对象都可以有自己的计时器和超时。然后,每当一个对象检测到值得报告的事件时,它就会通知 GUI。
【解决方案3】:

如果可能的话,我可能会尝试概括出某种数据总线,当对象处于“活动”状态时,让它们将自己添加到要更新的对象列表中。如果对象由数据库支持,我特别想使用此模式,因为这样您可以聚合多个查询,而不必为每个对象执行单个查询。

如果最终没有特定对象的侦听器,没什么大不了的,数据将无处可去。

然后,核心更新程序代码可以使用单个计时器(或多个计时器,或任何合适的计时器)来确定何时获取更新。这样做更多的是数据流,而不是“状态更新”,最终可能会节省很多。

【讨论】:

  • 这打破了数据对象的封装,但到目前为止这听起来是我最好的选择。
  • 我不是特别喜欢用持久性代码封装“数据”(通常是域对象),因为它往往会产生高度耦合,从长远来看很难解决。但是,建立这种耦合是有正当理由的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多