Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#多线程,停止所有进程的线程中的循环_C#_Multithreading_For Loop - Fatal编程技术网

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

C#多线程,停止所有进程的线程中的循环,c#,multithreading,for-loop,C#,Multithreading,For Loop,我有一个多线程的问题 我正在做一个项目,我们有一列火车,一条铁路和一辆汽车。 列车正在移动,如果需要,轨道交叉和轿厢停止。这三样东西都在不同的线程上。 有两个按钮,一个开始移动火车,第二个创建一个新的PictureBox汽车 要移动列车,我只需使用for循环,通过调用更改PictureBox的位置。 铁路道口只检查列车的位置,当列车在特定位置时,将灯变为红色 创建汽车如下所示: private void Operation1() { this.BeginInvoke((MethodInv

我有一个多线程的问题

我正在做一个项目,我们有一列火车,一条铁路和一辆汽车。 列车正在移动,如果需要,轨道交叉和轿厢停止。这三样东西都在不同的线程上。 有两个按钮,一个开始移动火车,第二个创建一个新的PictureBox汽车

要移动列车,我只需使用
for
循环,通过
调用
更改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);
            }
        });
    }
private void Operation1()
{
this.BeginInvoke((MethodInvoker)委托()
{
PictureBox a=新PictureBox();
a、 位置=新点(333361);
a、 背景色=颜色。黑色;
a、 尺寸=新尺寸(20,37);
添加(a);
对于(int i=0;i<140;i++)
{
a、 位置=新点(a.Location.X,a.Location.Y-3);
睡眠(50);
}
});
}
但是当它启动时,汽车就会消失,如果另一个线程正在运行,它就会停止并等待,直到这个循环结束。
问题在哪里?我希望有人能尽快帮助我。

您需要强制重新绘制控件。看看Windows窗体的方法。对于WPF,您可以查看。

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


当您使用像这样的调用来更新UI时,线程被交给UI线程,它会一直冻结所有内容,这完全是胡说八道。:)

没有任何原因导致表单重新绘制,请查看Ok,消失汽车的问题消失了。但奇怪的是,我不在火车上使用它,而且它还在工作:)。无论如何,谢谢你。但是仍然不知道为什么其他线程在for循环时停止如果有选项,您能解释它应该如何工作吗?我对多线程相当陌生,通常我所做的是创建一个后台工作程序(如果是桌面项目)或一个线程(如果是其他项目)。基本上,您有一个主线程(控制UI的线程),然后启动一个线程,该线程有一个方法负责从其他类读取信息,然后更新UI对象。后台工作人员有一个在其工作完成时触发的事件:在那里您插入代码以根据其他地方的信息更新UI。事件BackgroundWorker.OnRunWorkerCompleted()特别有用。