2014-10-27 77 views
0

我有一个多线程问题。C#多线程,循环停止所有进度的线程

我正在做一个项目,我们有一列火车,铁路道口和一辆汽车。 火车正在移动,如果需要的话,铁路道口和汽车停下来。所有三件事都在不同的线程上。 有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); 
      } 
     }); 
    } 

但是,当它启动车子消失,如果其他线程运行它停止,等待,直到这个循环结束。 问题在哪里?我希望有人能尽快帮助我。

+1

没有什么导致窗体重绘,看看http://stackoverflow.com/questions/2376998/force-form-to-redraw – tolanj 2014-10-27 14:25:26

+0

好吧,消失的汽车问题已消失。但奇怪,我不使用它在火车和它的工作:)。不管怎样,谢谢你。 但是,仍然不知道为什么其他线程停止循环时 – addictive 2014-10-27 14:50:07

回答

0

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

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

+0

如果有选项,你能解释它应该如何工作?我在多线程方面很新颖 – addictive 2014-10-28 20:24:14

+0

通常我所做的是创建一个后台工作者(如果它是桌面项目)或线程(如果是其他东西)。基本上你有你的主线程(控制UI的主线程),并且你触发一个Thread,它有一个方法可以响应从其他类读取信息,然后更新UI对象。后台工作人员在工作完成时会触发一个事件:在那里插入代码以基于其他信息更新UI。 – 2014-10-31 10:05:56

+0

事件BackgroundWorker.OnRunWorkerCompleted(http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.onrunworkercompleted(v = vs.110).aspx)特别有用。 – 2014-10-31 14:28:41