2014-11-24 47 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(); });