2012-07-25 1 views
2

Je dois lire dans une liste sur un thread (arrière-plan) alors qu'il peut être mis à jour à partir d'un autre (thread principal). J'essaie donc de créer une liste temporaire pour ne pas accéder à l'objet original. Comme des mises à jour peuvent avoir lieu à plusieurs endroits, il serait pratique de placer SyncLock sur la logique de lecture. Est-ce que c'est intrinsèquement faux? Quelles sont mes options pour verrouiller cela correctement, ou d'autres façons d'acquérir une copie accessible de la liste dans une condition multithread?SyncLock sur la liste dans Multithread lance toujours ArgumentException

' In Main thread: 
Public SomeList = New List(Of SomeClass) 
' ..edit list 


' In other thread: 
    Dim tempList As List(Of SomeClass) 
    SyncLock SomeList 
     tempList = SomeList.ToList 
    End SyncLock 

SomeList.ToList lance:

ArgumentException, tableau de destination n'a pas été assez longtemps. Cochez destIndex et length, ainsi que les limites inférieures du tableau.

Répondre

1

Après avoir examiné .ToList et donc New List(Of SomeClass)(.), dans le réflecteur, l'exception doit venir de is2.CopyTo(Me._items, 0)Me._items vient d'être mis à New T(count - 1) {}.

Cela signifie que le nombre d'éléments de la collection d'entrée (exprimé en ICollection(Of T) en is2) a dû augmenter après l'extraction de is2.Count.

En tant que tel, je demande à nouveau l'hypothèse dans ma réponse maintenant supprimée: Tous les endroits dans le fil principal, dans ' ..edit list, utilisent également SyncLock SomeList lors de la modification de la liste?

+1

Vous avez raison, je n'ai pas été éduqué correctement sur l'utilisation de SynckLock lorsque vous posez cette question, il est donc clair que la liste a été modifiée par un autre thread sans verrou, comme vous l'avez dit. Merci pour la mise à jour! – bretddog

0

Vous ne savez pas quel est l'équivalent dans VB, mais ne pouvez-vous pas faire quelque chose comme ça?

IList<string> roDinosaurs = dinosaurs.AsReadOnly(); 

Ou

tempList.AddRange(SomeList); 
+0

Merci! Peut-être que cela fonctionne, au moins jusqu'à présent, mais cherchait à comprendre aussi pourquoi mon utilisation de synclock est défectueuse. – bretddog

+0

@bretddog Je ne crois pas que ce soit bien. C'est la méthode qui jette l'erreur plutôt que le SyncLock, je ne pense pas qu'ils sont liés. (Ce ne serait certainement pas avec C# et lock). –

Questions connexes