C#里面MessageBox不能乱用,阻塞和非阻塞,模态对话框和非模态

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dexinzheng/article/details/46922525

我一开始以为这个MessageBox跟Delphi里面的ShowMessage是一样的,程序里可以随便放,因为C#里面就TM这一个封装好的弹出对话框提示消息函数,可以直接用的。


结果实习做程序测试被坑爹了,发现我错了,C#这个MessageBox默认是模态对话框,是阻塞的,也就是说你不区点击okNOCancel他一直显示在那里程序里后面的代码是停止的不往后执行,但是主程序仍然会响应其他消息,比如Timer事件,造成时序逻辑混乱。

原来随手写的是这样:

private void ReadOTPDataHandle()
        {
            if (xxxxxx)  //若命令字和地址都正确
            {
                xxxxxxxxxxxx;
            }
            else
            {
		MessageBox.Show("ERROR: communication data verify error!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cmdptr = 0; 
                mode = 4;
                comok = 100; 
                Btype = Type.Bu_no_type;
            }
        }


</pre><p></p><pre>

正确的写法应该是把MessageBox放在程序段的最后,这样:

private void ReadOTPDataHandle()
        {
            if (xxxxxx)  //若命令字和地址都正确
            {
                xxxxxxxxxxxx;
            }
            else
            {
                cmdptr = 0; 
                mode = 4;
                comok = 100; 
                Btype = Type.Bu_no_type;
                MessageBox.Show("ERROR: communication data verify error!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


就是下面两图的差别:


-------------

但是最后,那如果是普通的MessageBox.Show("asdfadsfasdf!"),这种不带图标和YesNo返回的,有没有问题呢?是不是就跟Delphi里面的ShowMessage一样了非模态可以任意弹出不用去处理?

展开阅读全文

没有更多推荐了,返回首页