Form.ShowDialog注意事项

本文探讨了一个Windows窗体应用中关于线程同步和窗体关闭的问题。在主窗体中打开一个子窗体进行耗时操作,原本的代码导致子窗体提前关闭,进而影响后续逻辑。通过调整线程执行顺序,确保了耗时操作完成后才关闭子窗体,并正确执行了委托返回结果的判断。修复后的代码确保了程序流程的正确性。

需求:窗体中显示其他窗体,使用ShowDialog等待其他窗体耗时代码结束后,根据委托返回的结果,执行下方代码。

问题现象:也能等待耗时操作完成之后,执行判断 if (user1 == null),之后走的(b, u)=>{}里的代码

问题代码:

# 主窗体
Form form1 = new Form((b, u) =>
                    {
                        if (b)
                        {
                            if (u != null)
                            {
                                user1 = u;
                            }
                        }
                        else
                        {
                            MessageBox.Show("失败");
                        }
                    }, "确认人1");
                    form1.ShowDialog();
                    form1.Dispose();

                    if (user1 == null)
                    {
                        MessageBox.Show("获取用户1失败");
                        return;
                    }
# 其他窗体
Thread thread = new Thread(() =>
        {
            bytes=耗时操作
            this.Invoke(() => { this.Close(); });
            action1(bytes, s);
        });
        thread.IsBackground = true;
        thread.Start();

原因:

先执行了Close();执行结束了ShowDialog,程序继续往下走。之后又执行了(b, u)=>{}

修改:

Thread thread = new Thread(() =>
        {
            bytes=耗时操作
             action1(bytes, s);
            this.Invoke(() => { this.Close(); });
        });
        thread.IsBackground = true;
        thread.Start();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值