C# foreach循环中抛出的IndexOutOfRangeException

C# foreach循环中抛出的IndexOutOfRangeException,c#,photon,C#,Photon,我正在使用光子服务器运行一个多人游戏,每100多个游戏中,服务器就会停止响应输入——查看日志文件,我得到以下异常: 2013-07-30 12:31:24918[11]错误文件室[(空)]- System.IndexOutOfRangeException:索引超出了 大堆在STSLib.Engine.handleInput(哈希表输入,Int32 playerId) 在C:\ProgramFiles(x86)\Photon\Photon中 src server\STSServer\STSLib\

我正在使用光子服务器运行一个多人游戏,每100多个游戏中,服务器就会停止响应输入——查看日志文件,我得到以下异常:

2013-07-30 12:31:24918[11]错误文件室[(空)]- System.IndexOutOfRangeException:索引超出了 大堆在STSLib.Engine.handleInput(哈希表输入,Int32 playerId) 在C:\ProgramFiles(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是一组玩家。returntable是我发送给客户端的其他数据的哈希表队列的哈希表,我只是用一个空队列实例化每个键

前缀循环被调用,并在游戏在这个场景中被破坏之前多次工作,也就是说,这个异常开始在游戏的中间被抛出。


有人能解释foreach循环如何抛出索引越界异常吗?

它不应该。。。除非您使用并发,并且在循环运行时在别处更改了players变量


抱歉,在循环中不可能更改玩家(我认为您将在该位置上得到一个运行时错误,但在foreach循环中不会)。。。除非您使用并发,并且在循环运行时在别处更改了players变量



好吧,在循环中不可能更改玩家(我想你会在该位置上得到运行时错误,但在foreach循环上不会)。你能粘贴整个foreach循环吗?
players
可能是一个IEnumerable,在该foreach循环之前没有被计算过。你可以尝试创建玩家吗?为了防止更改玩家列表时出现问题,你至少可以尝试使用
数组
,这永远不会发生,即使是在并发情况下也不会发生。对数据、类型和声明要更加精确。还指定是否使用任何并发。玩家已经被实例化了——这个异常开始在游戏的中间被抛出——在这个循环成功运行好几次之后,你可以粘贴整个FACH循环吗?<代码>玩家<代码>可能是一个iQuestBy,直到这个Frach循环才被评估。你可以尝试创建玩家吗?为了防止更改玩家列表时出现问题,你至少可以尝试使用
数组
,这永远不会发生,即使是在并发情况下也不会发生。对数据、类型和声明要更加精确。还指定是否使用任何并发。玩家已经被实例化了——这个异常开始在游戏的中间被抛出——在这个循环成功运行了好几次之后,或者是懒惰的评估在这里咬他,比如:<代码> var玩家=其他玩家。选择(x= > MyLax[x.ID])< /Cord> >我添加了完整的循环代码。players数组没有被修改——我只是实例化一个哈希表的值。你确定没有代码与你发布的代码同时运行吗?这几乎肯定是一个并发问题,我添加了更多的调试语句,但这种情况很少发生,我怀疑我会在一段时间内解决它。如果尝试加入大厅失败,玩家数组可能会重置,但我会调查一下,谢谢你的帮助。也许你可以在循环中插入一个断言来检查长度是否正确(未更改)然后在那一刻打印出列表,这样你就可以检查哪个玩家被删除了。或者可能是懒惰的评估在这里咬他,比如:
var players=otherPlayers.Select(x=>myArray[x.Id])
I添加了完整的循环代码。players数组没有被修改——我只是实例化一个哈希表的值。你确定没有代码与你发布的代码同时运行吗?这几乎肯定是一个并发问题,我添加了更多的调试语句,但这种情况很少发生,我怀疑我会在一段时间内解决它。如果尝试加入大厅失败,玩家数组可能会被重置,但我会调查一下,谢谢你的帮助。也许你可以在循环中插入一个断言来检查长度是否正确(未更改),然后打印出列表,这样你就可以检查哪个玩家被移除了。