Synchronized ArrayList verschwindet

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Synchronized ArrayList verschwindet

    Hallo,

    ich bin eben auf folgenden seltsamen Bug gestoßen.

    Ich arbeite mit VB.Net 3.5 und erstelle einen parallelen Programmcode. Entsprechend nutze ich als Container eine ArrayList, da ich diese mittels

    VB.NET-Quellcode

    1. Dim list As ArrayList = ArrayList.Synchronized(New ArrayList())


    Als threadsicheres Objekt erhalten sollte. Folgendes Problem tritt auf:

    Wenn Thread A gerade auf dem Objekt list die Methode list.Count aufruft und Thread B zugleich auf das gleiche Objekt list per list.Item(i) zugreifen will, meldet Thread B zurück, der "Index lag außerhalb des Bereichs". Wenn ich mir das Objekt ansehen will, kann Visual Studio plötzlich gar kein Objekt mehr finden und schreibt "Unable to evauate expression" für alle Member.

    Meine Frage an euch:
    Eigentlich sollte der Zugriff threadsicher sein. Sind euch ähnliche Probleme mit Synchronized-Objekten bekannt? Oder gibt es evtl. noch einen anderen Container für 3.5 , den ich verwenden könnte ?(
    Hi,

    das ist sehr schade. ein Wechsel auf VB 2010 liegt nicht in meiner Macht. Ich denke ich werde mir überlegen müssen einen eigenen threadsafen Wrapper zu basteln X( .

    Danke in jedem Fall für die Antwort.

    PS: Der Artikel beschreibt ein anderes Problem. Logische Zugriffsfehler fange ich bereits ab. Nur hätte ich erwartet, dass wenigstens der zeitgleiche Zugriff (lesend) koordiniert wird. Das Verschwinden des Objektes ist doch sehr merkwürdig!

    WinDUser schrieb:

    Das Verschwinden des Objektes ist doch sehr merkwürdig!

    Das Objekt "verschwindet" nicht. Das Debuggen von Multithreaded Anwendung ist nur ein klein bißchen anders ;)

    Logische Zugriffsfehler fange ich bereits ab

    Du möchtest also sagen, dass ein unerklärlicher Fehler auftritt, dieser aber durch das Framework verursacht wird und nicht durch "fehlerhaften" Code deinerseits? Möglich. Aber wie wahrscheinlich ... ???

    Wenn Thread A gerade auf dem Objekt list die Methode list.Count aufruft und Thread B zugleich auf das gleiche Objekt list per list.Item(i) zugreifen will, meldet Thread B zurück, der "Index lag außerhalb des Bereichs".

    How can?

    VB.NET-Quellcode

    1. <Serializable, DefaultMember("Item")> _
    2. Private Class SyncArrayList
    3. Inherits ArrayList
    4. ' Methods
    5. Friend Sub New(ByVal list As ArrayList)
    6. MyBase.New(False)
    7. Me._list = list
    8. Me._root = list.SyncRoot
    9. End Sub
    10. ...
    11. Public Overrides ReadOnly Property Count As Integer
    12. Get
    13. SyncLock Me._root
    14. Return Me._list.Count
    15. End SyncLock
    16. End Get
    17. End Property
    18. ...
    19. Public Overrides Default Property Item(ByVal index As Integer) As Object
    20. Get
    21. SyncLock Me._root
    22. Return Me._list.Item(index)
    23. End SyncLock
    24. End Get
    25. Set(ByVal value As Object)
    26. SyncLock Me._root
    27. Me._list.Item(index) = value
    28. End SyncLock
    29. End Set
    30. End Property

    Das ist ausm Reflector. WIE soll da ein Fehler durch Threading auftreten können? _root sperrt ALLE Member so dass nur jeweils ein Thread darauf zugreifen kann.