2011-01-13 66 views
0

好的,所以我有一個讀取另一個進程內存的應用程序。我最初有多個掃描線程需要閱讀的各個領域。這是處理器密集型的,所以我決定採用觀察者模式。除了我有一個奇怪的行爲,一切都很好。使用Observer模式的怪異行爲

這裏是發生了什麼事

我有2個雷達(覆蓋和映射)都具有連接到內存掃描儀和小怪的一個新的名單上被通知觀察者類。

所以我打開雷達1(映射),它非常重視它的守望者到掃描儀並等待暴徒名單更新通知

打開雷達2(疊加)。同樣的事情發生,另一個觀察者被附加。

一切都很好,迄今爲止 現在有列表中的怪物的特性,其中之一是IsFilteredOut。該屬性在收到列表後會在雷達代碼中設置。

現在怪異的行爲是,無論我做什麼,第二個雷達將在這兩種雷達的列表中打開的變化小怪的所有屬性。這就好像我是通過ref通過名單,但我不是。實際上,我每次通過列表時都會創建一個moblist類的新實例。

以下是通知代碼。正如你所看到的,我每次都會創建一個moblist類的新實例。

Private Sub NotifyMobListUpdated(ByVal Mobs As List(Of MobData)) 
    If Mobs IsNot Nothing Then 
     For Each w As Watcher In _watchers 
      If w.Type And WatcherTypes.MobList = WatcherTypes.MobList OrElse w.Type And WatcherTypes.All = WatcherTypes.All Then 
       w.MobListUpdated(New MobList(Mobs)) 
      End If 
     Next 
    End If 
End Sub 

這是它在看守類

''' <summary> 
''' IWatcher MoblistUpdated Implementation 
''' </summary> 
''' <param name="Mobs">The Updated mob list</param> 
''' <remarks></remarks> 
Public Sub MobListUpdated(ByVal Mobs As MobList) Implements IWatcher.MobListUpdated 
    Try 
     PostNewMobList(Mobs) 
    Catch ex As Exception 
    End Try 
End Sub 

Public Sub PostNewMobList(ByVal Mobs As MobList) 
    _sync.Post(New SendOrPostCallback(AddressOf OnNewMobList), Mobs) 
End Sub 

Private Sub OnNewMobList(ByVal state As Object) 
    Dim mobs As MobList = TryCast(state, MobList) 
    Try 
     If mobs IsNot Nothing Then 
      RaiseEvent NewMobList(mobs) 
     End If 
    Catch ex As Exception 
    End Try 
End Sub 

的處理此錯誤是推動我堅果和任何幫助,將不勝感激。

感謝

回答

1

我其實每次我通過列表時,創建moblist類的新實例。

其中只能防止列表改變,而不是列表元素。你也必須克隆元素對象。我沒有雷達和怪物的線索,你可以考慮使用Send而不是Post。

+0

謝謝,你指出我在正確的方向。我實際上最終在UI中更改了我的代碼以獲取列表的克隆。 – bhmahler 2011-01-13 19:43:51