我正在制作一个 xna 游戏,问题涉及以下类:
Game 类 - 该类侦听
Player 类下面两个类的事件侦听器 - 该类启动 Fire() 事件,告诉游戏玩家发射子弹
Bullet类 - 这个类启动一个 SelfDestruct() 事件(经过一定距离后),告诉游戏该实例必须被删除
游戏类有一个子弹列表,在更新方法中它在这个列表上执行一个 foreach
事件Fire() 的监听器将新的项目符号添加到项目符号列表 SelfDestruct() 的事件监听器从列表中删除发送者(通过强制转换为项目符号)
这两个事件以及更新方法都会锁定列表以确保线程安全。但它仍然抛出异常,告诉列表在 foreach 期间被修改。
我该如何解决这个问题;因为我确实锁定了列表..但这不起作用:
Update:
public void Update(GameTime gameTime)
{
player.Update(GameTime gameTime);//can throw fire event
lock(Bullets)//Lock the list for thread safett
{
foreach(Bullet b in Bullets)//Throws exception when bullet is added/removed
b.Update(gameTime);//can throw selfdestruct event
}
}
Fire listener:
void listen_fire(object sender, EventArgs e)
{
Player p = (Player)sender;/used to get coordinates and rotation stored in the player
lock(Bullets)
{
Bullets.Add(new Bullet(p.Position,p.Rotation));
}
}
Self destruct listener:
void listen_selfdestruct(object sender, EventArgs e)
{
lock(Bullets)
{
Bullets.Remove((Bullet)sender);
}
}
我认为这个解决方案可能会失败,因为事件被抛出在一个线程中,该线程本身已经锁定了列表
欢迎任何解决方案,感谢您阅读我的问题