兄弟我现在做socket程序,客户端连接服务器端后,服务器端第一时间向客户端发送配置文件,客户端根据配置文件来加载控件,大体流程就是这样。
现在问题是,客户端socket的接受数据事件接收到了服务器端发送的配置信息,但是却无法动态加载控件
报错是 “在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
我在网上找了很多解决办法,基本都无效,各位仁兄是否有同样经历,告之一二,感谢了,
现在问题是,客户端socket的接受数据事件接收到了服务器端发送的配置信息,但是却无法动态加载控件
报错是 “在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
我在网上找了很多解决办法,基本都无效,各位仁兄是否有同样经历,告之一二,感谢了,
控件当然不能跨线程直接操作了,要Control.Invoke才行。
具体看我的blog。
http://healerkx.cnblogs.com/
简单说来,你只能在某一个线程上,而且应该是UI线程上创建控件,别的线程只能“通知”!
用Control.Invoke来通知。
http://blog.sina.com.cn/s/blog_4b1dc9bb0100flyu.html
{
public static SynchronizationContext SyncContext;
private void Form1_Load(object sender, EventArgs e)
{
SyncContext = SynchronizationContext.Current;
}
}
然后用Form1.SyncContext.Send(...)来将创建的控件的过程,送到Form1所在的窗口线程执行。另一种方法是:保存一个Form1的实例,然后用form1.Invoke(...)来做。
static class Program
{
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
MainForm = new Form1(); //<--
Application.Run( MainForm );
}
public static Form1 MainForm;
}