按键打破循环
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;
}
}
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;
}
}