按键打破循环

时间:2015-02-26 03:27:48

标签: c# winforms loops keypress break

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 键按其设想的方式工作? 谢谢你的阅读。

2 个答案:

答案 0 :(得分:2)

试试我的朋友:

    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;
        }
    }

答案 1 :(得分:0)

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

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