在 foreach 循环中抛出 IndexOutOfRangeException
Posted
技术标签:
【中文标题】在 foreach 循环中抛出 IndexOutOfRangeException【英文标题】:IndexOutOfRangeException thrown in foreach loop 【发布时间】:2013-07-30 16:43:17 【问题描述】:我正在使用 Photon 服务器运行多人游戏,在每 100 多场游戏中,服务器停止响应输入 - 查看日志文件,我收到以下异常:
2013-07-30 12:31:24,918 [11] 错误 Lite.Room [(null)] - System.IndexOutOfRangeException:索引超出范围 大批。在 STSLib.Engine.handleInput(哈希表输入,Int32 playerId) 在 C:\Program Files (x86)\Photon\Photon src-server\STSServer\STSLib\Engine.cs:第 130 行
查看我的代码,我的引擎类的第 130 行是一个 foreach 循环:
foreach (Player p in players)
Queue playerQueue = new Queue();
returnTable.Add(p.playerId, playerQueue);
其中 player 是我为代表(你猜对了!)游戏玩家而创建的一个类,而 player 是一个 Player 数组。 returntable,是我发送给客户端的其他数据的哈希表队列的哈希表,我只是用一个空队列实例化每个键。
foreach 循环被调用,并在游戏在这种情况下被破坏之前运行多次——也就是说,这个异常在游戏过程中开始被抛出。
谁能解释一下 foreach 循环如何抛出索引越界异常?
【问题讨论】:
你能粘贴整个foreach循环吗?players
可能是一个 IEnumerable,直到这个 foreach 循环才被评估。你应该创造球员吗?
以防万一更改玩家列表出现问题,您至少可以尝试this
使用array
永远不会发生这种情况,即使是并发也是如此。更准确地了解数据、类型和声明。还要指定是否使用任何并发。
玩家已经被实例化——这个异常在游戏过程中开始被抛出——在这个循环成功运行了几次之后
【参考方案1】:
它不应该...除非您使用并发并且在循环运行时在其他地方更改了 player 变量。
Afaik 无法在循环内更改播放器(我认为您会在该位置收到运行时错误,但不会在 foreach 循环上)。
【讨论】:
或者可能是懒惰的评价在这里咬他,比如:var players = otherPlayers.Select(x => myArray[x.Id])
我添加了完整的循环代码。玩家数组没有被修改——我只是在为一个哈希表实例化值。
您确定没有代码与您发布的代码同时运行吗?
它几乎肯定是一个并发问题,我添加了一些更多的调试语句,但这种情况很少发生,我怀疑我会弄清楚一段时间。如果加入大厅的尝试失败,可能会重置玩家数组,但我会调查一下,感谢您的帮助。
也许您可以在循环中放置一个断言以检查长度是否正确(未更改)并在那时打印出列表,以便您可以检查哪个玩家已被删除。以上是关于在 foreach 循环中抛出 IndexOutOfRangeException的主要内容,如果未能解决你的问题,请参考以下文章
为啥覆盖 Parallel.foreach 循环的 .NET 单元测试依赖于硬件?
Pandas 使用 If/Then/Else 语句在循环中抛出错误
为啥我的 foreach 循环与 users.json 文件中的键不匹配
队列ForEach循环抛出InvalidOperationException