2011-10-14 27 views
1

私は助けが必要です。私はarraylistと仕事していて、突然このエラーが出ます。コレクションが変更されました。列挙操作が実行されないことがあります。 C#

型「System.InvalidOperationExceptionが」の未処理の例外がmscorlib.dll

で発生しました追加情報:コレクションが変更されました。列挙操作が実行されないことがあります。

これは、それが例外を示したコードです...

​​

ノート

foreach (PC_list x in onlinelist) { 
    if ((nowtime.Subtract(x.time)).TotalSeconds > 5) { 
    Invoke(new MethodInvoker(delegate { 
     index = Main_ListBox.FindString(x.PcName); 
     if(index != ListBox.NoMatches) 
     Main_ListBox.Items.RemoveAt(index); 
    })); 
    onlinelist.Remove(x); 
    //Thread.Sleep(500); 
    } 
} 

  • onlinelistは、ArrayListの
  • です
  • nowtimeとx.timeがDateTimeです。

コールスタック

mscorlib.dll!System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext() + 0x122 bytes  
BlueBall.exe!BlueBall.BlueBall.clean_arraylist() Line 74 + 0x1a8 bytes C# 
BlueBall.exe!BlueBall.BlueBall.server() Line 61 + 0x8 bytes C# 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x63 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes  
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x2c bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes 
[Native to Managed Transition] 

答えて

14
foreach (PC_list x in onlinelist) 
{    
    onlinelist.Remove(x); // cannot do this 
} 

これが問題の核心です。 foreachで反復処理中のコレクションからアイテムを削除することはできません。ループの前にリストのローカルを作成し、ループをコピーして元のものから削除することができます。または、の後に元のループを終了すると、別のアイテムリストを残してにすることができます。または、forループに切り替えて、それを逆順に反復することができます。の末尾にあるアイテムを削除することができます。

あなたがここにいる間、あなたがC#1/.NET 1.1/Visual Studioの2003年での作業立ち往生されていない場合、あなたはTは、内のオブジェクトの種類である強いList<T>、へArrayListからの切り替えを検討する必要がありますがコレクション。あなたの場合、それはList<PC_list>になります。 System.Collections.Generic.List<T>で見つけることができます。

あなたの質問にmultithreadingというタグが付いているので、collections built with concurrency in mindにご相談ください。

0

あなたのロジックは壊れています。リスト内のxの次のオブジェクトに移動するようイテレータに依頼していますが、リストからxを削除したため、そのようなことはありません。回避策はたくさんありますが、それを行う伝統的な方法は、ループの先頭にあるの前のオブジェクトを削除することです。 (これは、削除時に再編成されないコレクションに対してのみ有効です)

+1

これはそれほどのことではありません。 foreachループ中にリストから項目を削除することはできません。 – phoog

4

foreachブロック内のonlinelistは変更できません。このため、このエラーが発生します。 試してみてください:

ArrayList RemoveList = new ArrayList(); 
foreach (PC_list x in onlinelist) 
      { 
       if ((nowtime.Subtract(x.time)).TotalSeconds > 5) 
       { 
        Invoke(new MethodInvoker(delegate 
        { 
         index = Main_ListBox.FindString(x.PcName); 
         if(index != ListBox.NoMatches) 
          Main_ListBox.Items.RemoveAt(index); 
        })); 

        RemoveList.Add(x); 
        //Thread.Sleep(500); 
       } 
      } 
foreach (PC_list x in RemoveList) 
     { 
       onlinelist.Remove(x); 
     } 
関連する問題