Потому что, пока ваш KeyDown
метод выполняется в al oop, другие методы не могут быть запущены. То есть KeyUp
никогда не запустится, и вы застрянете.
В приложении Windows Forms (winforms) событие никогда не будет прервано для другого события. Хандер второго события (KeyUp
) должен ждать до завершения первого.
Не ясно, чего вы пытаетесь достичь, поскольку ваш код ничего не делает, кроме ожидания.
Если вы хотите сделать какую-то анимацию, вы можете запустить таймер при нажатии клавиши (без l oop), затем анимировать при каждом тике таймера и, наконец, остановить анимацию при нажатии клавиши вверх.
Пример:
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 управляется событиями.