Vb.net 使用观察者模式的奇怪行为

Vb.net 使用观察者模式的奇怪行为,vb.net,observer-pattern,Vb.net,Observer Pattern,好的,我有一个应用程序,它读取另一个进程的内存。我最初有多个扫描线程,用于我需要阅读的各个区域。这是处理器密集型的,所以我决定使用观察者模式。一切都很好,只是我有一种奇怪的行为 下面是正在发生的事情 我有两个雷达(覆盖和映射),都有一个观察者类,连接到内存扫描器,并在新的移动列表上得到通知 所以我打开雷达1(地图),它将它的观察者连接到扫描仪,并等待移动列表更新通知 打开雷达2(覆盖)。同样的事情发生了,另一个观察者也被连接了 到目前为止一切都很好 现在列表中的暴民有了一些属性,其中之一就是Is

好的,我有一个应用程序,它读取另一个进程的内存。我最初有多个扫描线程,用于我需要阅读的各个区域。这是处理器密集型的,所以我决定使用观察者模式。一切都很好,只是我有一种奇怪的行为

下面是正在发生的事情

我有两个雷达(覆盖和映射),都有一个观察者类,连接到内存扫描器,并在新的移动列表上得到通知

所以我打开雷达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
“”
''IWatcher Moblist更新的实现
''' 
''更新的暴徒名单
''' 
Public Sub MobListUpdated(ByVal Mobs As MobList)实现IWatcher.MobListUpdated
尝试
PostNewMobList(Mobs)
特例
结束尝试
端接头
公共子PostNewMobList(ByVal Mobs作为MobList)
_sync.Post(新的SendOrPostCallback(OnNewMobList的地址),Mobs)
端接头
私有子OnNewMobList(ByVal状态作为对象)
作为MobList的Dim mobs=TryCast(状态,MobList)
尝试
如果暴徒不是什么
RaiseEvent新移动列表(移动)
如果结束
特例
结束尝试
端接头
这个错误快把我逼疯了,任何帮助都将不胜感激

谢谢

实际上,每次通过列表时,我都会创建一个moblist类的新实例


这只会阻止列表的更改,而不会阻止列表元素的更改。您还必须克隆元素对象。我没有雷达和暴徒的线索,你可能想考虑用发送代替POST。

谢谢,你指出了我的正确方向。实际上,我最终改变了UI中的代码以获取列表的克隆。