2011-08-27 7 views
0

J'ai l'erreur La collection a été modifiée; l'opération d'énumération peut ne pas s'exécuter. à System.Collections.Queue.QueueEnumerator.MoveNext()La collection a été modifiée; l'opération d'énumération peut ne pas s'exécuter

 Queue ReqQ = (Application["ReqQ"] != null) ? ((Queue)Application["ReqQ"]) : 
new Queue(50); 

      if (ReqQ != null) 
      { 
         foreach (object OReq in ReqQ) 
        { 
          string mId = (string)OReq; 
          if (mId.Split('~')[1].Equals(reqUid.Split('~')[1]) && (DateTime.Parse(mId.Split('~')[0]).AddMinutes(1 * int.Parse(string.IsNullOrEmpty(delay) ? "0" : delay)) > DateTime.Now)) 

          { 
             isSuccess = false; 
             break; 
          } 
        } 

       } 

       else 
       { 
          ReqQ = new Queue(10); 
          isSuccess = true; 
       } 

       if (isSuccess) 
       { 

         if (ReqQ.Count >= 10) //only keep last 10 messages in application cache 
           ReqQ.Dequeue(); 

            ReqQ.Enqueue(reqUid); 
            Application["ReqQ"] = ReqQ; 
       } 

Répondre

2

Il vous ressemble avez une collection unique qui vous lisez et la modification de plusieurs threads (pour les demandes différentes). Pour commencer ce n'est pas sûr en utilisant Queue - et c'est en particulier pas vrai si vous itérez la collection pendant que vous modifiez dans un autre. (EDIT: Je viens de remarquer que vous n'utilisez même pas une collection générique Si vous utilisez .NET 4, il n'y a pas de raison d'utiliser les collections non génériques ...)

Vous ne savez pas quoi faire Si vous essayez d'obtenir peut peut être en train de changer juste pour utiliser ConcurrentQueue<T> à la place, mais vous devez être conscient que, au moment où vous avez itéré sur la collection, les valeurs que vous lisez peuvent déjà avoir été enlevées dans un autre fil.

+0

oui jon, il y a plusieurs demandes utilisez cette file d'attente à la fois. Cela n'arrive pas toujours. 2-3 fois par jour. Quel code devrais-je modifier pour cela? –

+1

@cpsinghal: Soit utiliser le verrouillage ou une collection qui prend en charge l'accès simultané (tel que ConcurrentQueue) –

Questions connexes