收集被修改;枚举操作不能执行。C#

收集被修改;枚举操作不能执行。C#,c#,.net,multithreading,invoke,C#,.net,Multithreading,Invoke,我需要帮助。我正在使用arraylist,突然出现了这个错误 mscorlib.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:集合已修改;枚举操作不能执行 这是显示异常的代码 foreach (PC_list x in onlinelist) { if ((nowtime.Subtract(x.time)).TotalSeconds > 5) { Invoke(new MethodInvoker(delegate

我需要帮助。我正在使用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);
  }
}
在哪里

注:

  • onlinelist是arraylist
  • nowtime和x.time是日期时间
调用堆栈

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]
这是问题的核心。在
foreach
中对集合进行迭代时,无法从集合中删除该项。您可以选择在循环之前创建列表的本地副本,在副本上循环,然后从原始副本中删除。或者,您可以保留一个单独的项目列表,以便在完成原始循环后删除。或者,您可以切换到
for
循环并向后迭代,这允许您在执行时从末尾删除项目

当您在这里时,如果您不使用C 1/.NET 1.1/VisualStudio 2003,则您可能需要考虑从<>代码> ARARYLIST/<代码>切换到更强的<代码>列表< /> >,其中<代码> t>代码>是集合中对象的类型。在您的情况下,这将是一个

列表
。您可以在
System.Collections.Generic.List
中找到它


由于您的问题被标记为多线程,因此咨询

是的,你的逻辑被打破了。您要求迭代器移动到列表中
x
之后的下一个对象,但是您已经从列表中删除了
x
,因此没有这样的事情。有很多变通方法,但传统的方法是删除循环顶部的前一个对象。(这仅适用于删除时不重新组织的集合。)

不能修改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);
        }

不完全是这样。在foreach循环中,无法从列表中删除任何项。
foreach (PC_list x in onlinelist)
{            
     onlinelist.Remove(x); // cannot do this
}
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);
        }