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

Jas*_*idi 2 .net c# multithreading invoke

我需要帮助.我正在和一个arraylist一起工作,突然间我得到了这个错误.

mscorlib.dll中发生了未处理的"System.InvalidOperationException"类型异常

附加信息:收集已修改; 枚举操作可能无法执行.

这是显示异常的代码...

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

哪里

public class PC_list {
    public string PcName;
    public string ip;
    public string status;
    public string NickName;
    public DateTime time;

}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 在线列表是一个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]
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 15

foreach (PC_list x in onlinelist)
{            
     onlinelist.Remove(x); // cannot do this
}
Run Code Online (Sandbox Code Playgroud)

这是问题的核心.当你在一个集合中迭代它时,你不能从集合中删除一个项目foreach.您可以选择在循环之前制作列表的本地副本,循环复制并从原始文件中删除.或者,您可以完成原始循环保留要删除的单独项目列表.或者你可以切换到一个for循环并向后迭代它,这允许你在去的时候从末尾删除项目.

当你在这里,如果你不坚持用C#1/.NET 1.1/Visual Studio 2003中的工作,你可能要考虑切换ArrayList到强List<T>,其中T是集合中的对象的类型.在你的情况下,那将是一个List<PC_list>.你可以找到它System.Collections.Generic.List<T>.

而且由于您的问题已被标记multithreading,因此在考虑使用并发性构建集合时也是一个明智的想法.