为什么我的指数超出范围? 我多次看了我的代码,我找不到错误的地方。 这是清单:
List<PictureBox> bullets = new List<PictureBox>();
int i=0;
事件KeyDown:
void Tank_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData== Keys.space)
{
if (bullets.Count==0)
{
PictureBox bullet = new PictureBox();
kulka.Name = Convert.ToString(i);
kulka.Image = new Bitmap("foto/kulka2.png");
Random dd = new Random();
if (pagr.Name == "RotateW")
bullet.Location = new Point(pagr.Location.X + 16, pagr.Location.Y - 8);
if (pagr.Name == "RotateS")
bullet.Location = new Point(pagr.Location.X + 16, pagr.Location.Y + pagr.Height + 2);
if (pagr.Name == "RotateA")
bullet.Location = new Point(pagr.Location.X - 8, pagr.Location.Y + 16);
if (pagr.Name == "RotateD")
bullet.Location = new Point(pagr.Location.X + pagr.Height + 11, pagr.Location.Y + 16);
bullet.Width = 5;
bullet.Height = 8;
bullet.SizeMode = PictureBoxSizeMode.StretchImage;
bullet.BringToFront();
bullets.Add(bullet);
panelis.Controls.Add(bullets[i]);
Task task = new Task(() => this.bullet_move(i, pagr.Name));
task.Start();
this.Refresh();
}
}
}
这是我的任务:
void bullet_move(int j,string rotation)
{
while (true)
{
if (rotation == "RotateW")
{
BeginInvoke(new Action(() => bullets[j].Top = bullets[j].Top - 1));
if (bullets[j].Top < 2)
{
BeginInvoke(new Action(() => panelis.Controls.Remove(bullets[j])));
bullets.RemoveAt(j);
Application.DoEvents();
i = 0;
break;
}
}
}
}
有时我会把索引超出范围:
BeginInvoke(new Action(() => bullets[j].Top = bullets[j].Top - 1));
有时在这里:
BeginInvoke(new Action(() => panelis.Controls.Remove(bullets[j])));
为什么我会收到错误? :/ 谢谢你的帮助...... :)
答案 0 :(得分:1)
我首先用Invoke替换BeginInvoke。 BeginInvoke是一个异步调用,你在一个非常紧凑的循环中进行调用。调用可能不会按照它们的顺序执行。这将使代码几乎无法调试。