问题描述
最近遇到一个问题,在new 一个form 后发现新创建的窗体卡住了,里面的控件刷不出来。百度后发现原来是在一个新的线程里创建了窗体,而新线程是一直阻塞的,导致窗体刷不出来。
解决办法
参考网上的解决方法,在主UI线程里写了创建窗体的方法,然后在新线程里调用。为了更好的实现封装性(新线程所在的类不直接访问主线程所在的类),在主窗口新建一个静态的委托,以便调用:
public static Action<string> OnShowForm;
在主窗体中把委托和创建窗体的方法名关联起来
public ClientMainForm()
{
InitializeComponent();
OnShowRespondRequestForm += ShowForm;
}
在创建窗体的方法中,注意要调用主UI线程的Invoke函数来实现创建窗体,为了代码精炼,使用了匿名委托和匿名方法
public void ShowForm(string str)
{
//在监听线程里调用这个委托方法
//这里用Invoke表示通过主UI线程创建窗体
//括号里面传入一个匿名的无参Action委托
//委托里传入一个匿名无参方法
this.Invoke(new Action(delegate(){
MessageForm fo = new MessageForm (str);
fo.Show();
}));
}
或者换一种写法,利用Invoke来传递参数