C# 如何从另一个线程填充面板?

C# 如何从另一个线程填充面板?,c#,multithreading,winforms,C#,Multithreading,Winforms,我已经尝试了几种方法来解决这个问题,但是我似乎找不到一种有效的方法。我有一个GUI,当你按下一个按钮时,所有的处理都在一个线程上完成。例如,如果我有以下代码: public void coolMethod() { int a = 0; while (a != 20) { addPicturebox(); a++; Thread.Sleep(1000);

我已经尝试了几种方法来解决这个问题,但是我似乎找不到一种有效的方法。我有一个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,直到方法完成或任何其他建议


如果可以的话,非常感谢。如果已经回答了这个问题,请您也将我链接到该页面,因为我已经浏览了很多页面,但找不到适用于此场景的示例。

最简单的方法是使用lambda调用表达式,只需替换

addPicturebox();


它也能像你所希望的那样工作。新线程将暂停,直到添加控件为止

如果我理解正确,是否要从另一个线程更改GUI

如果是这种情况,则需要使用调度器


哇,这是一个快速响应,我已经尝试过了,效果非常好。非常感谢Valjura@Faker如果答案符合你的期望,就接受它。
panel1.Invoke((MethodInvoker)(() =>
{
    addPicturebox();
}));
panel1.Invoke((Action)delegate { addPicturebox(); });