C#多线程,停止所有进程的线程中的循环
本文关键字:进程 线程 循环 多线程 | 更新日期: 2023-09-27 18:28:02
我有一个多线程问题。
我正在做一个项目,我们有一列火车、铁路道口和一辆汽车。列车正在行驶,如有需要,轨道交叉口和车厢将停止。这三件事都在不同的线索上。有两个按钮,一个开始移动火车,第二个创建一个新的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);
}
});
}
但当它启动时,car就会消失,如果另一个线程正在运行,它就会停止并等待,直到这个循环结束。问题出在哪里?我希望有人能尽快帮我。
而不是使用这个。BeginInvoke,尝试创建另一个线程来更新UI。将对象封装在一个类中,并从该类中读取位置。
当你像这样使用Invoke来更新UI时,线程会被移交给UI线程,它会一直冻结所有东西,这完全是垃圾。:)
您需要强制重新绘制控件。看看Windows窗体的Control.Refresh()方法。对于WPF,您可以看看这个线程。