c#在新线程创建窗体卡住问题

问题描述

最近遇到一个问题,在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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值