2014-10-27 131 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