InvalidOperationException未处理-原因

本文关键字:原因 未处理 InvalidOperationException | 更新日期: 2023-09-27 17:50:20

首先,在代码的开头,我声明了一个ArrayList public ArrayList ArrivalsInApp = new ArrayList();。然后,很久以后,我将从XML文件下载一些数据。对于每个名为"flight"的XmlNode,我正在创建一个Panel。

在创建Panel时,我将其名称添加到ArrivalsInApp ArrayList中。面板的生成是一种方法。该方法有几个foreach循环和IF条件。从技术上讲,它所做的一切都决定了Panel是应该创建(如果是在XML中而不是在应用程序中(、更新(在两者中(还是删除(在应用程序内而不是在XML中(。

在该方法中,我用XML获取所有航班的名称,并保存到ArrayList中。现在使用foreach,我检查应用程序中(ArrivalsInApp ArrayList中(的所有航班是否也在XML中。我使用以下代码:

foreach (string y in ArrivalsInApp)
{
if (XmlArrivals.Contains(y) == false)
{
*code*
}
}

"decising"方法在form1_load上调用,每30秒使用一个Timer。当计时器达到指定值时,我重新加载XML,然后调用该方法。但是,在foreach (string y in ArrivalsInApp)行,我得到了一个InvalidOperationException,注释为"Collection已被修改;枚举操作可能不会执行。"。我完全绝望了,我不知道是什么原因造成的。

如果我运行.exe文件(如果我只是调试它,在计时器达到值后,程序关闭并显示此错误(,会发生什么,即无论应该更新还是删除面板,面板都会被删除,并且弹出未处理的异常错误。如果解释有点混乱,很抱歉。如果有人想让我发布整个源文件(也许是整个项目(,请告诉我。然而,由于它现在有大约1800行代码,因此需要大量的解释。

InvalidOperationException未处理-原因

我得到一个InvalidOperationException,注释为"Collection修改;枚举操作可能无法执行。">

错误消息中的解释是正确的。集合(在本例中为"ArrivalsInApp"(在循环过程中被修改。要么你添加了一些东西,要么从中删除了一些东西。

如果要循环遍历集合并同时修改它,则需要先获取集合的副本,然后在修改原始集合时循环遍历副本。

制作副本的最简单方法是使用Linq和ToArray((或ToList((

在文件的顶部,如果它还不存在:

using System.Linq;

然后在foreach语句中,您可以执行以下操作:

foreach(string y in ArrivalsInApp.ToArray())
{
  // code to do stuff.
}