我有2个主题。 在我的工作线程(不是主线程)中,我创建了一个picturebox数组,有时我需要在主窗体中添加一个新的图片框,但我无权访问此表单。我在某处读到了我需要使用invoke方法,但我只知道如何更新一个图片框或标签。 我不知道如何用这段代码做到这一点:
food[x].Location = new Point(100,100);
food[x].Size = new Size(10,10);
food[x].BorderStyle = BorderStyle.Fixed3D;
food[x].ImageLocation = "food.png";
this.Controls.Add(food[x]);
food[x].BringToFront;
有人可以帮助我吗?
答案 0 :(得分:2)
在WinForms中,您应该只有一个UI线程,并且只有该线程应该创建或使用UI组件。
如有必要,请使用BackgroundWorker
加载图片,并将PictureBox
创建保留在BackgroundWorker
完成时的UI线程中。
答案 1 :(得分:1)
后台线程无法访问主线程拥有的GUI控件。
如果要将信息传递给GUI,则线程必须与主线程通信,然后主线程操作GUI控件。
BackgroundWorker线程提供了向主线程发送信号的方法。例如,请参阅http://www.dotnetperls.com/backgroundworker。
答案 2 :(得分:0)
如果您使用WPF我建议使用SynchronazationContext来保存主线程,所有其他线程将使用SynchronazationContext的这个实例来访问主线程(UI)。您以这种方式使用它(注意:我生成了一个执行此操作的方法,所有其他方法将访问此方法以更新UI):
SynchronazationContext ctx = null;
void DoSomething()
{
ctx = SynchronazationContext.Current;
Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();
}
//This method run in separate Threads
void ThreadProc()
{
//Some algorithm here
SendOrPostCallback callBack = new SendOrPostCallback(UpdatePic);
ctx.Post(callBack, String.Format("Put here the pic path");
}
void UpdatePic(string _text)
{
//This method run under the main method
//In this method you should update the pic
}
在.NET 5.0中,您可以通过将方法标记为async来调用此复杂函数,并在调用同步方法时编写'await' - 将同步方法作为异步方法并使用主线程更新UI。