[英]C# do while loop start stop
我正在尝试为此循环制作一个停止按钮,但它无限期运行,当我单击按钮 2 时没有任何反应
bool dowhile = false;
private void button1_Click(object sender, EventArgs e)
{
do
{
for (int i = listbox1.Items.Count - 1; i >= 0; i--)
{
string textstring = listbox1.Items[i].ToString();
richTextBox1.AppendText("" + textstring + ": Done\n");
Thread.Sleep(1000);
}
} while (!dowhile);
}
private void button2_Click(object sender, EventArgs e)
{
this.dowhile = true;
}
我在哪里 go 错了?
对不起“lvlchanger”错字,代码现在没问题,没有遗漏
我也在寻找一个不那么长的解决方法:))
在您的button1_Click
完成之前,系统无法处理消息队列中的任何内容(即按钮单击、重绘等)——它永远不会。 这正是导致所有那些“{blah} 没有响应”消息的原因——代码没有及时响应消息队列。
基本上,不要那样做。 一个hacky修复将是一些DoEvents()
,但不是; 基本上,正确地处理来自button2_Click
的事件。 也许您应该从计时器滴答声中运行刷新?
Thread.Sleep
几乎总是不正确的方法; 当您发现自己想在代码中使用类似的东西或Application.DoEvents
时,是时候退后一步,想想您真正在做什么以及为什么它不起作用。 一个新的设计应该在你的未来。
这里真正的问题是您在 UI 线程上工作,这会阻止用户与您的应用程序交互。 在循环完成处理后,您对 Button2 的单击将得到识别和处理,此时它完全没有任何作用。
这是因为线程一次只能完成一项任务。 而且,事实上, Thread.Sleep(100)
只会让情况变得更糟,因为它会强制线程旋转并且在 100 毫秒内什么都不做。 循环完成要多花 100 毫秒,而绝对没有增益。
这个(常见)问题的正确解决方案是使用BackgroundWorker
class之类的东西将循环转到单独的线程上。 MSDN 条目有一个很好的使用示例,包括您的特定用例:允许用户取消长时间运行的后台任务。
将Application.DoEvents()
添加到循环中以允许应用程序处理来自其他源的事件。
/EDIT这应该可以,但是...
“这几乎从来都不是正确的答案”——科迪·格雷
private void button1_Click(object sender, EventArgs e)
{
bool dowhile = false;private void button1_Click(object sender, EventArgs e){
do
{
for (int i = listbox1.Items.Count - 1; i >= 0; i--)
{
string textstring =listbox1.Items[i].ToString();
richTextBox1.AppendText("" + textstring + ":` `Done\n");
Thread.Sleep(1000);
}
} while (!lvlchanger && dowhile == false);
}
private void button2_Click(object sender, EventArgs e)
{
this.dowhile = true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.