2010-01-26 51 views
3

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

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

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

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

+0

什么事件让你想要更新对象? – Zied 2010-01-26 03:51:13

+0

基本上有些形式的计时器,没有外部事件要挂钩。 – 2010-01-26 03:55:39

回答

0

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

+0

这很容易。困难的部分是告诉对象什么时候在没有用户点击刷新按钮的情况下首先进行自我更新。 – 2010-01-26 03:47:41

+0

也许我不明白你的问题。每个对象都不处理自己的刷新吗?每个对象都可以有自己的计时器和超时时间。然后,只要对象检测到值得报告的事件,就会通知GUI。 – 2010-01-26 04:23:47

0

我可能会尝试推广某种数据总线,如果可能的话,当对象处于“活动”状态时,将它们自己添加到要更新的对象列表中。如果对象是由数据库支持的,我尤其会试图使用这种模式,因为这样可以聚合多个查询,而不必为每个对象执行一次查询。

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

核心更新程序代码然后可以使用一个计时器(或多个或任何适当的)来确定何时获取更新。做为更多的数据流,更少的'状态更新'可能会最终节省很多的理智。

+0

这打破了数据对象的封装,但到目前为止,这听起来像是我最好的选择。 – 2010-01-26 06:15:32

+0

我不特别喜欢用持久性代码封装'数据'(通常是域对象),因为它往往会创建高度的耦合,从长远来看这可能非常困难。但是,有合理的理由来实现这种耦合。 – kyoryu 2010-01-27 02:49:35

1

您可以为所有或一组活动对象使用一个调度程序(调度程序)。调度员可以先处理高优先级任务,然后再处理其他任务。 你可以看到这个article关于长时间运行的活动对象与代码找出如何做到这一点。另外我建议看看半同步/半异步模式。 如果您有任何问题 - 欢迎。

+0

什么是半同步/半异步模式? – 2010-02-10 06:13:26

+0

我认为,最好是阅读本文件 www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf。简而言之,我们拥有执行自己的任务(同步任务或用户进程)和一些异步执行的外部任务(低级事件或来自其他子系统的调用)的活动对象。 – garik 2010-02-10 08:11:47