Коллекция была изменена;операция перечисления может не выполняться - PullRequest
0 голосов
/ 27 августа 2011

Я получаю сообщение об ошибке Коллекция была изменена;Операция перечисления может не выполняться.в System.Collections.Queue.QueueEnumerator.MoveNext ()

        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; 
                } 

1 Ответ

3 голосов
/ 27 августа 2011

Похоже, у вас есть одна коллекция, которую вы читаете и модифицируете из нескольких потоков (для разных запросов). Начнем с того, что небезопасно использовать Queue - и , в частности , не соответствует действительности, если вы выполняете итерацию по коллекции, когда изменяете ее в другой. (РЕДАКТИРОВАТЬ: я только что заметил, что вы даже не используете универсальную коллекцию. Если вы используете .NET 4, нет никаких причин использовать неуниверсальные коллекции ...)

Непонятно, чего вы пытаетесь достичь - вы можете суметь сойти с рук, просто переключившись на использование ConcurrentQueue<T>, но вы должны знать, что в тот момент, когда вы перебираете коллекцию, прочитанные вами значения, возможно, уже удалены из другого потока.

...