【发布时间】:2013-09-01 05:58:46
【问题描述】:
我正在做一个xna游戏,问题涉及到以下几个类:
游戏类——这个类监听下面两个类的事件监听器
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);
}
}
我认为这个解决方案可能会失败,因为事件被抛出到一个线程中,该线程本身已经锁定了列表
欢迎任何解决方案,感谢您阅读我的问题
【问题讨论】:
标签: c# list events exception xna