我有两个按钮,一个用于启动,一个用于在我的UI表单中停止,我有一个无限循环,在方法中的类名程序中执行某些功能。用户点击它的开始按钮调用此方法执行无限循环,我需要在用户单击停止按钮时打破此无限循环,之后我的编译器将突破此无限循环并进入按钮停止单击内的代码。
我正在尝试使用Application.DoEvents()
方法,如果我的无限循环代码在开始按钮单击内部,这很有效,但如果我的无限循环代码在我创建的新类中,即程序,如何可以使用Application.DoEvents()
方法来摆脱这种无限循环。
示例:
namespace inFiniteLoopTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool stopBtnClk = false;
bool startBtnClk = false;
private void StartBtn_Click(object sender, EventArgs e)
{
stopBtnClk=false;
startBtnClk = true;
while(true)
{
//some code to be executed
Application.DoEvents();
if (stopBtnClk == true)
{
break;
}
}
}
private void StopBtn_Click(object sender, EventArgs e)
{
stopBtnClk = true;
if (startBtnClk == true)
{
//Application.Exit();
MessageBox.Show("success");
}
}
这很好用。
但是
public class programs
{
public static void infiniteLoop(bool stopBtnClick)
{
while(true)
{
//some code to be executed
Application.DoEvents();
if (stopBtnClk == true)
{
break;
}
}
}
}
//and my UI code to call this class is
namespace inFiniteLoopTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool stopBtnClk = false;
bool startBtnClk = false;
private void StartBtn_Click(object sender, EventArgs e)
{
stopBtnClk=false;
startBtnClk = true;
programs.infiniteLoop(stopBtnClk);
}
private void StopBtn_Click(object sender, EventArgs e)
{
stopBtnClk = true;
if (startBtnClk == true)
{
//Application.Exit();
MessageBox.Show("success");
}
}
}
但这不起作用。
即使编译器在单击停止按钮时显示消息“成功”,但调试器仍然表示在我的表单中运行。 我希望我的问题很清楚。 我恳请你尽快回答我的问题,摆脱这个问题! 如果你特意带来一个主题,我会公开接受你的回答。
抱歉,我是C#的初学者,但我需要继续这样做。谢谢!
答案 0 :(得分:7)
不要阻止GUI线程。您必须使用Application.DoEvents()来更新GUI这一事实是糟糕设计的一个指标。在单独的工作线程中完成工作。
BackgroundWorker
预定了这项任务。
答案 1 :(得分:0)
您提供的代码实际上很难阅读,但就创建无限循环而言,我可以看到:while(looping) // do stuff
然后当你按下Stop按钮时,将bool变量循环设置为false,它将跳出循环并显示消息。
答案 2 :(得分:0)
为什么使用由按钮确定的开始停止条件而不是无限循环?
我认为你可以拥有一个变量,只需称之为
bool stop_loop = false
和你的循环
while(!stop_loop){ //CODE HERE }
现在,当您单击第一个按钮(开始)时,您将调用该方法(无论它在何处)以启动循环。在你点击按钮停止并且stop_loop的值变为True之前,循环似乎是无穷无尽的。
HTH
答案 3 :(得分:0)
更改无限循环方法的签名,如下所示:
public static void infiniteLoop(ref bool stopBtnClick)
...
答案 4 :(得分:0)
在第二个代码片段中,无限循环在一个子程序中启动,该子程序接受一个布尔值作为参数。该子程序如何获得第二次机会来查看该布尔值?它只会“看到”一次这个值,而那时它是错误的。这是一个范围问题。