2014-11-24 58 views
0

我已經嘗試了幾種方法來做這件事,但我似乎無法找到一個將工作。我有一個GUI,當你按下按鈕時,所有的處理都是在一個線程上完成的。舉一個例子,如果我有以下代碼:如何從另一個線程填充面板?

public void coolMethod() 
    { 
     int a = 0; 
     while (a != 20) 
     { 
      addPicturebox(); 
      a++; 
      Thread.Sleep(1000); 
     } 
    } 

    int width = 3; 
    int height = 3; 
    int imgCounter = 0; 

    public void addPicturebox() 
    { 
     PictureBox pb = new PictureBox(); 
     pb.Size = new Size(50, 50); 
     pb.Location = new Point(width, height); 
     pb.ImageLocation = @"C:\Users\User1\Pictures\white.png"; 
     pb.Show(); 

     panel1.Controls.Add(pb); 
     imgCounter++; 

     width += 53; 

     if (imgCounter == 5) 
     { 
      height += 53; 
      width = 3; 
      imgCounter = 0; 
     } 
    }` 

它將工作然而coolMethod()是在不同的線程運行,我不能更新/面板上呈現來自不同的線程添加控件。

有沒有人有一個解決方案,我可以在thread1上運行coolMethod,但是一旦它調用addPicturebox(),這個方法將在gui線程上運行,並暫停thread1直到方法結束或任何其他建議。

非常感謝,如果你可以。如果已經回答了這個問題,您可以將我也鏈接到該頁面,因爲我查看了很多人,但無法找到適用於此場景的示例。

回答

1

做的最簡單的方法是用一個lambda表達式調用,只需更換

addPicturebox(); 

panel1.Invoke((MethodInvoker)(() => 
{ 
    addPicturebox(); 
})); 

它也就像你想讓它。新線程暫停,直到控件添加

+0

哇,這是一個快速的反應,我已經嘗試這樣做,它完美地工作。謝謝你一堆Valjura – Faker 2014-11-24 08:44:54

+0

@Faker如果它符合你的期望,接受答案。 – Grx70 2014-11-24 08:48:07

0
panel1.Invoke((Action)delegate { addPicturebox(); });