我需要等待来自并口的一个高电平,用了一个while循环。然后如果十秒钟内这个电平还不来的话,就取消等待。但是,我把while循环加上以后,Timer就进不了Tick了,去掉那个等待的话,可以进Tick。请问是怎么回事呢?            .......初始化
            while (d == 0)//这里等待并口信号
            {
                WinIO.GetPortVal((IntPtr)0x378, out d, 1);
            }
        }        private void timer1_Tick(object sender, EventArgs e)
        {
            int temp = Convert.ToInt32(lb_TimeCounter.Text);
            temp = temp - 1;
            lb_TimeCounter.Text = Convert.ToString(temp);
            lb_TimeCounter.Refresh();
            if (temp == 0)
                this.Close();
        }

解决方案 »

  1.   

    在循环中取时间DateTime.Now,与循环开始前的时间比较,时间到了就跳出。
      

  2.   

    谢谢楼上,这个也是个思路。
    但是我原先的想法怎么就实现不了呢。加上while循环,就不进Tick了。
      

  3.   

    我在Timer_Tick里加入一个断点,当我的程序里加入While循环以后,就不在这个断点处中断了。
      

  4.   

    根据2楼的建议,把代码改成下面这样,问题解决了,但是就是想不明白,Timer的这个Tick中断,是不是还有优先级问题呢?难道系统为了保证While循环的可靠性,自动把Timer给屏蔽了?            DateTime DT = DateTime.Now;
                while ((d&0xFF) == 0xFF)//等待触发信号
                {
                    WinIO.GetPortVal((IntPtr)0x378, out d, 1);
                    TimeDiff = DateTime.Now - DT;
                    lb_TimeCounter.Text = Convert.ToString(10-TimeDiff.Seconds);
                    lb_TimeCounter.Refresh();
                    if (TimeDiff.Seconds == 10) break;                        
                }
                    this.Close();
      

  5.   

    while循环的时候,整个线程就停在这儿了,其他的消息都无法被处理。
      

  6.   

    如果我没有理解错你的意思的话,你把这段改为这样就应该可以好了,其它不变:           while (d == 0)//这里等待并口信号
                {
                    WinIO.GetPortVal((IntPtr)0x378, out d, 1);
                    Application.DoEvents();
               }
      

  7.   

    while (d == 0)//这里等待并口信号
    {
        WinIO.GetPortVal((IntPtr)0x378, out d, 1);
        Application.DoEnvent();
    }
      

  8.   

           boolean stop;//全局变量           .......初始化
                stop = false;            while (d == 0 )//这里等待并口信号
                {
                    WinIO.GetPortVal((IntPtr)0x378, out d, 1);
                    Application.DoEvents();
                    if (stop==true) break;
                }
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                int temp = Convert.ToInt32(lb_TimeCounter.Text);
                temp = temp - 1;
                lb_TimeCounter.Text = Convert.ToString(temp);
                lb_TimeCounter.Refresh();
                if (temp == 0)
                    Stop = true;
            }