" int ans = 2;
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i <21; i++)
{
ans = 2;
label1.Text += i.ToString();
while (true)
{
if (ans == 1)
{
break;
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
ans = 1;
} "
这是一个简单的应用
我想打印一个号码&amp;然后等待按钮点击以打破while循环
但是当我运行应用程序时,表单不显示。
“T认为问题是while(true)”。
该怎么办?
答案 0 :(得分:2)
使用计时器。表单加载时启动计时器。每次滴答时,递增数字并显示它。单击按钮,您只需要停止计时器。
private Timer _myTimer;
private int number = 0;
private void Form1_Load(object sender, EventArgs e)
{
_myTimer = new Timer();
_myTimer.Interval = 1; // 1 millisecond
_myTimer.Tick += new EventHandler(MyTimer_Tick);
_myTimer.Start();
}
// increments the number at timer tick
private void MyTimer_Tick(object sender, EventArgs e)
{
number ++;
// TODO: update UI here
}
// Stops the timer
private void button1_Click(object sender, EventArgs e)
{
_myTimer.Stop();
}
答案 1 :(得分:0)
最好不要在这里使用循环。由于此循环不会结束,因此您不会离开Form_Load,也不会显示表单。如果您在用户点击按钮时尝试执行某项任务,为什么不将该逻辑移至button1_Click
?
答案 2 :(得分:0)
实现您描述的任务的正确方法是:
private EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset);
private void Form1_Load(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 26; i++)
{
ewh.WaitOne();
Action updateLable = () => label1.Text = "" + i;
label1.BeginInvoke(updateLable);
}
});
}
private void button1_Click(object sender, EventArgs e)
{
ewh.Set();
}
正如您所看到的,我已使用.Net busy wait替换了您的wait handle(而(true))。
其中一个答案描述了一个每毫秒行动一次的计时器 - 这是一种忙碌的等待。
答案 3 :(得分:0)
这是 async/await 的用途。使用&#34; async&#34;标记你的Load()事件,然后&#34; await&#34;在Button单击处理程序中触发ManualResetEvent时继续的任务:
private System.Threading.ManualResetEvent mre = new System.Threading.ManualResetEvent(false);
private async void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 21; i++)
{
label1.Text = i.ToString();
mre.Reset();
await Task.Factory.StartNew(() => { mre.WaitOne(); });
}
button1.Enabled = false;
label1.Text = "Done!";
}
private void button1_Click(object sender, EventArgs e)
{
mre.Set();
}