收集被修改;枚举操作可能无法执行

时间:2011-08-27 11:49:20

标签: asp.net web-services c#-4.0 asmx

我收到了错误 收集被修改;枚举操作可能无法执行。    在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 个答案:

答案 0 :(得分:3)

看起来你有一个集合,你正在从多个线程中读取和修改(针对不同的请求)。首先使用Queue并不安全 - 如果您在另一个集合中修改集合时迭代整个集合,则特别不正确。 (编辑:我刚刚注意到你甚至没有使用泛型集合。如果你使用的是.NET 4,那么没有理由使用非泛型集合......)

目前还不清楚你想要实现的目标 - 你可以能够通过改为使用ConcurrentQueue<T>来取而代之,但是当你需要时,你需要注意已经遍历集合,您读取的值可能已经在另一个线程中出列了。