【问题标题】:IndexOutOfRangeException thrown in foreach loop在 foreach 循环中抛出 IndexOutOfRangeException
【发布时间】: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 永远不会发生这种情况,即使是并发也是如此。更准确地了解数据、类型和声明。还要指定是否使用任何并发。
  • 玩家已经被实例化——这个异常在游戏过程中开始被抛出——在这个循环成功运行了几次之后

标签: c# photon


【解决方案1】:

它不应该...除非您使用并发并且在循环运行时在其他地方更改了 player 变量。

Afaik 无法在循环内更改播放器(我认为您会在该位置收到运行时错误,但不会在 foreach 循环上)。

【讨论】:

  • 或者可能是懒惰的评价在这里咬他,比如:var players = otherPlayers.Select(x => myArray[x.Id])
  • 我添加了完整的循环代码。玩家数组没有被修改——我只是在为一个哈希表实例化值。
  • 您确定没有代码与您发布的代码同时运行吗?
  • 它几乎肯定是一个并发问题,我添加了一些更多的调试语句,但这种情况很少发生,我怀疑我会弄清楚一段时间。如果加入大厅的尝试失败,可能会重置玩家数组,但我会调查一下,感谢您的帮助。
  • 也许您可以在循环中放置一个断言以检查长度是否正确(未更改)并在那时打印出列表,以便您可以检查哪个玩家已被删除。
猜你喜欢
  • 2013-12-18
  • 2014-06-06
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
相关资源
最近更新 更多