好的,所以我有一個讀取另一個進程內存的應用程序。我最初有多個掃描線程需要閱讀的各個領域。這是處理器密集型的,所以我決定採用觀察者模式。除了我有一個奇怪的行爲,一切都很好。使用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
的處理此錯誤是推動我堅果和任何幫助,將不勝感激。
感謝
謝謝,你指出我在正確的方向。我實際上最終在UI中更改了我的代碼以獲取列表的克隆。 – bhmahler 2011-01-13 19:43:51