【问题标题】:How to stop infinite loop when user press ESC button in C# Windows forms当用户在 C# Windows 窗体中按下 ESC 按钮时如何停止无限循环
【发布时间】:2022-01-03 18:24:50
【问题描述】:

我对 C# 很陌生。目前从事编程工作。我遇到了问题。

一个无限的while循环正在执行。我希望循环应该无限执行,直到用户按下 ESC 按钮。当按下 ESC 按钮时,循环应该会中断。

您会认为存在Console.KeyAvailable() 之类的命令。但我使用的是 Windows 窗体。使用此命令时,我收到错误

“当任一应用程序没有控制台时,无法查看是否按下了键”

那我该怎么办。我搜索了一些我知道使用线程或任务并行库的东西。由于我是新手,请您告诉我线程或 TPL 哪个对我有好处。

什么时候应该使用 TPL,什么时候应该使用线程? 或者有没有其他命令可以代替Console.KeyAvailable()

【问题讨论】:

标签: c# multithreading while-loop task-parallel-library


【解决方案1】:

将 Form 的 KeyPreview 属性设置为 True,然后在 Form 的 KeyDown 事件中检查 Escape。请注意,这仅在表单具有 FOCUS 时才有效。如果您需要它在其他情况下工作,那么您需要做更多的工作并通过 WH_KEYBOARD_LL 使用低级键盘挂钩(不是微不足道的)。在这个例子中,无限工作正在通过async/await 在 button1 处理程序中完成,并通过一个简单的标志取消。肯定有更复杂的方法可以做到这一点:

public Form1()
{
    InitializeComponent();
    this.KeyPreview = true;
}

private bool cancel = false;

private async void button1_Click(object sender, EventArgs e)
{
    cancel = false;
    button1.Enabled = false;
    while (!cancel)
    {
        label1.Text = DateTime.Now.ToString();
        await Task.Delay(1000);
    }
    button1.Enabled = true;
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        cancel = true;
        label2.Text = "Cancel @ " + DateTime.Now.ToString("HH:MM:ss.ffff");
        e.SuppressKeyPress = true;
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2020-06-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多