none
MessageBox.Show()的问题 RRS feed

  • 问题

  • private void timer2_Tick(object sender,EventArgs e)
    {
        if(isecond<0)
        {
            timer2.Stop();
            MessageBox.Show("小于系统时间","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
        }
        else if(isecond==0)
        {
            timer2.Stop();
            MessageBox.Show("时间到");
        }
        else
            labtime.Text="剩余"+(--isecond)+"秒";
    }

    =====================================

    上段代码中,红色代码与蓝色代码(timer2.Stop()MessageBox.Show())互换一下位置,就会出现一个问题,程序执行MessageBox.Show()后就会路过timer2.Stop();,如果没有点击MessageBox.Show()弹出的窗口,就会一直不停的弹出窗口。如何才能在用户响应MessageBox.Show()对话框之后,程序才继续执行。

    2010年5月11日 3:46

答案

  • 从逻辑上来讲应该是把 Stop 放到 MessageBox 之前的。正如楼上所言,MessageBox 可以是 Modal 的,Modal 表示只有当用户响应后才继续执行程序。所以,互换 Stop 以及 MessageBox 的位置,则会造成问题。

    另外 Timer 是在单独的线程上 Tick 的,虽然 UI 线程被阻塞了但 Timer 仍然可以 Tick。


    Mark Zhou
    2010年5月11日 10:18

全部回复

  • MessageBox.Show()是阻塞方法,当弹出的窗口没有被点掉之前,timer2.Stop()是执行不到的,但是Timer一直在tick,所以会一直弹出窗口。
    Shuhai Shen - http://leonax.net
    2010年5月11日 7:20
  • 换个 Timer,例如 System.windows.forms.timer
    2010年5月11日 8:36
  • 我记得VB关于Messagebox对话框里好像可以设置没有收到MessageBox的返回值,程序停止运行。C#也应该有吧!只是这里的用法没有返回值而已。
    2010年5月11日 8:56
  • 从逻辑上来讲应该是把 Stop 放到 MessageBox 之前的。正如楼上所言,MessageBox 可以是 Modal 的,Modal 表示只有当用户响应后才继续执行程序。所以,互换 Stop 以及 MessageBox 的位置,则会造成问题。

    另外 Timer 是在单独的线程上 Tick 的,虽然 UI 线程被阻塞了但 Timer 仍然可以 Tick。


    Mark Zhou
    2010年5月11日 10:18