2010-01-26 26 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