好的,所以我有一个应用程序读取另一个进程内存。我最初有多个扫描线程用于我需要阅读的各个区域。这是处理器密集型的,所以我决定采用观察者模式。一切都很好,除了我有一个奇怪的行为。
以下是发生的事情
我有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
这是在Watcher类
中处理的地方''' <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
这个错误让我感到疯狂,任何帮助都会非常感激。
由于
答案 0 :(得分:1)
我实际上每次通过列表时都会创建一个新的moblist类实例。
仅阻止列表更改,而不是列表元素。您还必须克隆元素对象。我对雷达和小怪没有线索,你可能要考虑使用Send而不是Post。