我遇到多线程问题。
我正在做一个我们有火车,铁路交叉口和汽车的项目。 火车正在移动,如果需要,铁路交叉口和车停在那里。这三件事都在不同的线程上。 有2个按钮,一个开始移动火车,第二个创建一个新的PictureBox汽车。
要移动列车,我只需使用for
循环,Invoke
更改PictureBox的位置。
铁路交叉口只检查火车的位置,并在火车到达特定位置时将灯光变为红色。
创建汽车如下:
private void Operation1()
{
this.BeginInvoke((MethodInvoker)delegate()
{
PictureBox a = new PictureBox();
a.Location = new Point(333, 361);
a.BackColor = Color.Black;
a.Size = new Size(20, 37);
Controls.Add(a);
});
}
汽车已经创建,很好。
现在我想在Operation1()
中使用这样的循环移动汽车:
private void Operation1()
{
this.BeginInvoke((MethodInvoker)delegate()
{
PictureBox a = new PictureBox();
a.Location = new Point(333, 361);
a.BackColor = Color.Black;
a.Size = new Size(20, 37);
Controls.Add(a);
for (int i = 0; i < 140; i++)
{
a.Location = new Point(a.Location.X, a.Location.Y - 3);
Thread.Sleep(50);
}
});
}
但是当它启动时汽车消失,如果另一个线程正在运行它停止并等待直到这个循环结束。 问题出在哪儿?我希望有人能尽快帮助我。
答案 0 :(得分:0)
您需要强制控件重绘。请查看Windows窗体的Control.Refresh()方法。对于WPF,您可以查看this thread。
答案 1 :(得分:0)
尝试创建另一个更新UI的线程,而不是使用this.BeginInvoke。 将对象封装在一个类中,并从该类中读取位置。
当您使用这样的Invoke来更新UI时,线程被移交给UI线程并且它一直冻结所有内容,这完全是废话。 :)