2011-08-27 68 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

はいjon、複数の要求がこのキューを使用しています。これはいつも起こるわけではない。 1日2〜3時間。どのようなコードを修正する必要がありますか? –

+1

@cpsinghal:ロックを使用するか、同時アクセスをサポートするコレクション(ConcurrentQueueなど)を使用します。 –

関連する問題