c#在新线程创建窗体卡住问题
来源:互联网 发布:红衣主教 知乎 编辑:程序博客网 时间:2024/05/19 20:59
问题描述
最近遇到一个问题,在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来传递参数
public void ShowForm(string str){ //通过Invoke传递两个参数 //匿名Action接受两个参数 //Action括号里的匿名方法接受两个参数 this.Invoke(new Action<string>(delegate(string ss){ MessageForm fo = new MessageForm (ss); fo.Show(); }), new object[]{str});}
这样写的原因是Invoke函数里面接受的是一个委托,不能直接写入匿名方法,所以用.net内置的Action委托封装了一下匿名方法,再传入函数。
0 0
- c#在新线程创建窗体卡住问题
- C#在线程中创建窗体
- 在子线程中创建新的窗体,遇到的问题。
- C#子线程创建新窗体心得(对Windows窗体控件进行线程安全调用)
- C# 如何在线程中显示一个新窗体
- C# 在线程中显示一个新窗体
- C#实现在线程中打开新窗体
- C# 线程中显示一个新窗体
- C# 线程中打开新窗体
- GTK+ 在非GTK主线程 创建新的GTK窗体崩溃问题 解决方案
- c#多窗体之间线程问题
- C# winform 防止界面卡住 线程 委托
- 子线程创建窗体
- C#在Panel中添加新的窗体(Form)
- C# 线程操作窗体
- C# 创建新的弹出窗体,并保持窗体弹出起点为右下角
- 如何在线程中创建可以响应事件的窗体
- C#中,如何在父窗体中创建子窗体?(如何确定父子窗体关系?)
- Activity中的四种启动模式
- DuiVision开发教程(2)-如何写一个简单的界面程序
- Android/iOS_Fiddler 实现手机的抓包(2)
- 北京住宿费发票 QQ;147107880 电话;13751037070
- Ajax IE charset问题
- c#在新线程创建窗体卡住问题
- popupWindow的创建和与alertDialog的区别
- Java抽象类与接口的区别
- AngularJS__绑定变量HTML文本的显示
- 济 南 建 筑 材 料 发 票 Q Q 1 4 7 1 0 7 8 8 0 电 话 1 3 7 5 1 0 3 7 0 7 0
- 高效判断是不是鼠标双击或者是多击的原理分析
- 百度地图之路径规划
- java 异常
- 【C语言】结构体中的内存对齐问题