c#的线程问题

本文关键字:问题 线程 | 更新日期: 2023-09-27 18:01:26

我有两个线程。在我的工作线程(不是主线程),我创建了一个图片盒数组,有时我需要添加一个新的图片盒到主表单,但我没有访问这个表单。我在某个地方读到,我需要使用调用方法,但我只知道如何更新一个图片框或标签。我不知道如何处理这段代码:

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;

有人能帮我吗?

c#的线程问题

在WinForms中,你应该只有一个UI线程,并且只有这个线程可以创建或使用UI组件。

如果需要,使用BackgroundWorker来加载图像,并在BackgroundWorker完成时将PictureBox的创建留给UI线程。

后台线程不能访问由主线程拥有的GUI控件。

如果你想与GUI通信,线程必须与主线程通信,主线程然后操作GUI控件。

BackgroundWorker线程提供了向主线程发送信号的方法。

如果您使用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。