2011-08-27 58 views
0

我收到错误 收集已修改;枚举操作可能不会执行。 在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; 
       } 

回答

2

看起来你已经得到了你正在阅读,并从多个线程修改(对于不同的请求)的单个集合。首先,使用Queue并不安全 - 而且它的尤其是如果您在通过集合进行迭代而您在另一个集合中对其进行修改,则不是这样。 (编辑:我刚刚注意到你甚至没有使用泛型集合,如果你使用.NET 4,没有理由使用非泛型集合......)

目前还不清楚你的“重新尝试实现 - 你可能只能改变使用ConcurrentQueue<T>而不是,但你需要知道,当你迭代集合的时候,你读取的值可能已经被取出另一个线程。

+0

是的,有多个请求在这个时候使用这个队列。这并不总是发生。一天2-3次。我应该修改哪些代码。 –

+1

@cpsinghal:使用锁定或支持并发访问的集合(如ConcurrentQueue) –

相关问题