修改了获取超额收集;枚举操作可能无法执行

本文关键字:操作 执行 枚举 获取 修改 | 更新日期: 2023-09-27 17:56:26

我有一个字符串列表List<string> mylist .我有一个后台操作,可以将字符串添加到此列表中。我使用另一个后台操作来处理此列表中的字符串

foreach (string pfile in mylist) 
{
//dostuff
}

这会导致此异常

Collection was modified; enumeration operation may not execute

在点击循环之前,我无法获取完整的文件列表,因为计时器操作会在循环运行时将文件添加到列表中。我怎样才能解决这个问题。请指教。

修改了获取超额收集;枚举操作可能无法执行

你必须建立某种锁定。

private object _locker = new object();  // Class member object
void ProcessList()  // Or whatever it's called
{
    lock (_locker)
    {
        foreach (string pfile in mylist)
        {
            //dostuff
        }
    }
}

确保使用相同的_locker对象将其他线程的 add 活动也包装在lock中。

如果//dostuff代码需要很长时间,您可能需要考虑对列表的副本进行操作,以最大程度地减少列表锁定的时间:

    string[] mylistCopy;
    lock (_locker)
    {
        mylistCopy = mylist.ToArray();
    }
    foreach (string pfile in mylistCopy)
    {
        //dostuff
    }