使用Observer模式的奇怪行为

时间:2011-01-13 19:20:46

标签: vb.net observer-pattern

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

以下是发生的事情

我有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

这个错误让我感到疯狂,任何帮助都会非常感激。

由于

1 个答案:

答案 0 :(得分:1)

  

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

仅阻止列表更改,而不是列表元素。您还必须克隆元素对象。我对雷达和小怪没有线索,你可能要考虑使用Send而不是Post。