线程问题c#

时间:2011-07-07 22:39:19

标签: c# multithreading forms main

我有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;

有人可以帮助我吗?

3 个答案:

答案 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。