首页 > 解决方案 > 当我释放按钮时,如何让我的 While 循环退出/中断?

问题描述

这里有什么问题?为什么 while 循环需要完成才能获得 keyup 事件,即使我已经发布了它..

我知道它只是暂时的,因为如果我只使用文本框,keyIsDown 在我释放按钮之前不会改变值。

void KeyDown(object sender, KeyEventArgs e)
{
    keyIsDown = true;
    if (e.KeyCode.ToString() == "F6")
    {
        while(keyIsDown)
        {
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            break;
        }           
    }
    e.Handled = false;
}

void KeyUp(object sender, KeyEventArgs e)
{
    keyIsDown = false;
    e.Handled = true;
}

标签: c#while-loop

解决方案


因为,当您的KeyDown方法在循环中运行时,其他方法无法运行。即,KeyUp永远不会运行,你会被卡住。

在 Windows 窗体 (winforms) 应用程序中,一个事件永远不会因另一个事件而中断。第二个事件处理程序 ( KeyUp) 必须等待第一个事件处理程序终止。

目前尚不清楚您要实现什么,因为您的代码除了等待之外什么都不做。

如果你想做某种动画,你可以在按键按下时启动一个计时器(没有任何循环),然后在计时器的每个滴答声处设置动画,最后在按键按下时停止动画。

例子:

public partial class Form1 : Form
{
    private readonly Timer _timer = new Timer();
    private readonly string[] _messages =
        { "hello", "world", "", "folks", "we", "made", "it", "" };
    private int _index;

    public Form1()
    {
        InitializeComponent();

        _timer.Interval = 500; // Milliseconds
        _timer.Tick += Timer_Tick;
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        label1.Text = _messages[_index];
        _index = (_index + 1) % _messages.Length;
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F6) {
            _timer.Start();
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        _timer.Stop();
        label1.Text = "stopped";
        _index = 0;
    }
}

请注意,应用程序始终在等待事件发生。然后它处理事件并再次等待。我们说 Winforms 应用程序是事件驱动的。


推荐阅读