摆脱我的无限循环

时间:2010-11-26 12:01:36

标签: c#

我有两个按钮,一个用于启动,一个用于在我的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#的初学者,但我需要继续这样做。

谢谢!

5 个答案:

答案 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)

在第二个代码片段中,无限循环在一个子程序中启动,该子程序接受一个布尔值作为参数。该子程序如何获得第二次机会来查看该布尔值?它只会“看到”一次这个值,而那时它是错误的。这是一个范围问题。