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

时间:2014-10-27 14:13:43

标签: c# multithreading for-loop

我遇到多线程问题。

我正在做一个我们有火车,铁路交叉口和汽车的项目。 火车正在移动,如果需要,铁路交叉口和车停在那里。这三件事都在不同的线程上。 有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);
            }
        });
    }

但是当它启动时汽车消失,如果另一个线程正在运行它停止并等待直到这个循环结束。 问题出在哪儿?我希望有人能尽快帮助我。

2 个答案:

答案 0 :(得分:0)

您需要强制控件重绘。请查看Windows窗体的Control.Refresh()方法。对于WPF,您可以查看this thread

答案 1 :(得分:0)

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

当您使用这样的Invoke来更新UI时,线程被移交给UI线程并且它一直冻结所有内容,这完全是废话。 :)