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 键按其设想的方式工作? 谢谢你的阅读。
答案 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方法一无所知。实际上,我认为这将是一种快速简便的方法。