CnPlayer

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 207|回复: 0

[转帖] c#在新线程创建窗体卡住问题

[复制链接]

68

主题

94

帖子

1912

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1912
发表于 2018-8-31 09:22:03 | 显示全部楼层 |阅读模式
转自:https://blog.csdn.net/u012989023/article/details/45776143

问题描述最近遇到一个问题,在new 一个form 后发现新创建的窗体卡住了,里面的控件刷不出来。百度后发现原来是在一个新的线程里创建了窗体,而新线程是一直阻塞的,导致窗体刷不出来。
解决办法参考网上的解决方法,在主UI线程里写了创建窗体的方法,然后在新线程里调用。为了更好的实现封装性(新线程所在的类不直接访问主线程所在的类),在主窗口新建一个静态的委托,以便调用:
  1. public static Action<string> OnShowForm;
复制代码
在主窗体中把委托和创建窗体的方法名关联起来
  1. public void ShowForm(string str)
  2. {
  3.         //在监听线程里调用这个委托方法
  4.         //这里用Invoke表示通过主UI线程创建窗体
  5.         //括号里面传入一个匿名的无参Action委托
  6.         //委托里传入一个匿名无参方法

  7.         this.Invoke(new Action(delegate(){
  8.             MessageForm fo = new MessageForm (str);
  9.             fo.Show();
  10.         }));
  11. }
复制代码
或者换一种写法,利用Invoke来传递参数
  1. public void ShowForm(string str)
  2. {
  3.         //通过Invoke传递两个参数
  4.         //匿名Action接受两个参数
  5.         //Action括号里的匿名方法接受两个参数

  6.         this.Invoke(new Action<string>(delegate(string ss){
  7.             MessageForm fo = new MessageForm (ss);
  8.             fo.Show();
  9.         }),
  10.         new object[]{str});
  11. }
复制代码
这样写的原因是Invoke函数里面接受的是一个委托,不能直接写入匿名方法,所以用.net内置的Action委托封装了一下匿名方法,再传入函数。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|玩儿家 ( 京ICP备16001541号-1 )

GMT+8, 2018-10-18 15:45 , Processed in 0.054810 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表