按键打破循环

Press key to break a loop

C# windows 表单存在问题,当执行循环时,它会禁用所有其他事件。所以当一个循环太长时,我无法正常停止程序(无法按下关闭按钮)。任何人都知道如何解决这个问题,请帮助。 为了简化问题,这里有一个示例代码。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.S)
        {
            CheckLoop();
        }
    }

    void CheckLoop()
    {
        progressBar1.Maximum = 9999999;
        progressBar1.Value = 0;
        while (progressBar1.Value != progressBar1.Maximum)
        {
            progressBar1.Value++;
            if (Control.ModifierKeys == Keys.Alt)//Did not break when press Alt???
                break;
        }
    }
}

问题是如何使 Alt 键按预期的方式工作? 感谢阅读。

我认为最简单的处理方法是Async,你可以启动运行循环的方法。然后有另一个密钥处理程序来停止该方法。

我不知道 DoEvents 方法。实际上,我认为这将是一种快速简便的方法。

试试这个我的朋友:

    void CheckLoop()
    {
        progressBar1.Maximum = 9999999;
        progressBar1.Value = 0;
        while (progressBar1.Value != progressBar1.Maximum)
        {
            progressBar1.Value++;
            Application.DoEvents();
            if (Control.ModifierKeys == Keys.Alt)//it should stop now
                break;
        }
    }
如果您想快速解决问题,

Application.DoEvents() 可以。

编辑:

根据您的工作,您可能会有不同的需求。我认为 timer 也非常易于使用。

让我们使用 timer:

查看您的代码

先决条件:

1-从工具箱添加定时器组件
2-双击添加的计时器以快速访问其 Tick 事件处理程序。

private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.S)
        {
            progressBar1.Maximum = 100;
            progressBar1.Value = 0;
            UpdateProgress.Enabled = true;
        }
    }

    private void UpdateProgress_Tick(object sender, EventArgs e)
    {
        //Do some work
        if (progressBar1.Value < progressBar1.Maximum) 
        {
            progressBar1.Value++;
        }


        if (Control.ModifierKeys == Keys.Alt)
        {
            UpdateProgress.Enabled = false;
        }
    }