Système.InvalidOperationException: Collection a été modifiée

Je suis une exception suivante lors de l'énumération par une file d'attente:

Système.InvalidOperationException:
La Collection a été modifiée; l'énumération
l'opération ne peut pas exécuter

voici l'extrait de code:

1:    private bool extractWriteActions(out List<WriteChannel> channelWrites)
2:    {
3:        channelWrites = new List<WriteChannel>();
4:        foreach (TpotAction action in tpotActionQueue)
5:        {
6:            if (action is WriteChannel)
7:            {
8:                channelWrites.Add((WriteChannel)action);
9:                lock(tpotActionQueue)
10:               {
11:                  action.Status = RecordStatus.Batched;
12:               }
13:           }
14:       }
15:       return (channelWrites.Count > 0);
16:   }

Je crois que je comprends le problème d'altération de la table de hachage à action.Status = RecordStatus.Batched, qui vis jusqu'à la MoveNext() sur l'énumérateur.
La Question est, comment puis-je la mettre en "modèle" correctement?

  • Pourquoi êtes-vous de verrouillage de la file d'attente? Ce code ne fait pas de sens pour moi.
  • Le plus grand point de l'agent recenseur de la documentation est-ce que "L'agent recenseur n'a pas accès exclusif à la collection; par conséquent, l'énumération d'une collection n'est pas intrinsèquement une procédure thread-safe. Pour garantir la sécurité des threads au cours de l'énumération, vous pouvez verrouiller la collection au cours de l'ensemble de l'énumération. Pour permettre la collecte pour être accessible par plusieurs threads pour la lecture et l'écriture, vous devez mettre en place votre propre synchronisation".
  • La droite. Ce code ne fait rien, même vaguement, comme ça.
  • Envisager l'utilisation d'un lecteur / enregistreur de verrouillage si vous avez besoin de synchroniser des lecteurs et des auteurs sur plusieurs threads.
InformationsquelleAutor kermit_xc | 2009-07-20