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就会消失,如果另一个线程正在运行,它就会停止并等待,直到这个循环结束。问题出在哪里?我希望有人能尽快帮我。

C#多线程,停止所有进程的线程中的循环

而不是使用这个。BeginInvoke,尝试创建另一个线程来更新UI。将对象封装在一个类中,并从该类中读取位置。

当你像这样使用Invoke来更新UI时,线程会被移交给UI线程,它会一直冻结所有东西,这完全是垃圾。:)

您需要强制重新绘制控件。看看Windows窗体的Control.Refresh()方法。对于WPF,您可以看看这个线程。