我正在使用 Photon 服务器运行多人游戏,每 100 多场比赛,服务器停止响应输入——查看日志文件,我收到以下异常:
2013 年 7 月 30 日 12:31:24,918 [11] 错误 Lite.Room [(null)] - System.IndexOutOfRangeException:索引超出数组范围。在 C:\Program Files (x86)\Photon\Photon src-server\STSServer\STSLib\Engine.cs:line 130 中的 STSLib.Engine.handleInput(Hashtable input, Int32 playerId)
查看我的代码,我的引擎类的第 130 行是一个 foreach 循环:
foreach (Player p in players)
{
Queue playerQueue = new Queue();
returnTable.Add(p.playerId, playerQueue);
}
Run Code Online (Sandbox Code Playgroud)
其中 player 是我用来代表(你猜对了!)游戏玩家的类,而玩家是一个 Players 数组。returntable,是我发送给客户端的其他数据的哈希表队列的哈希表,我只是用一个空队列实例化每个键。
在这种情况下,在游戏中断之前,foreach 循环被调用并多次工作——也就是说,在游戏过程中开始抛出这个异常。
谁能解释 foreach 循环如何抛出索引越界异常?
它不应该......除非您使用并发并且在循环运行时在其他地方更改了玩家变量。
Afaik 不可能在循环中更改播放器(我认为您会在该位置出现运行时错误,但不会在 foreach 循环中出现)。