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