C#为什么我不能在循环时退出这个?

时间:2017-07-05 15:19:55

标签: c# while-loop

我试着制作一个可以自动按空间的程序。 但我只能启用它。程序崩溃后。

所以我不能把它关掉。请求帮助

这是我的代码:

using System.Windows.Forms;

namespace Auto_Abillty
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    public bool startFlag = false;
    public bool stopFlag = false;
    private void Preiststop_Click(object sender, EventArgs e)
    {
        stopFlag = true;
    }
    private void Preist_Click(object sender, EventArgs e)
    {
        startFlag = true;
        while (startFlag)
        {
            SendKeys.Send(" ");
            Thread.Sleep(5000);
            if (stopFlag)
                startFlag = false;
        }
    }

}
}

4 个答案:

答案 0 :(得分:0)

我建议使用System.Windows.Forms.Timer,间隔为5000毫秒而不是你的方法。然后单击表单上的按钮,您可以启动或停止它。

另一种方法是将您的while循环移动到另一个线程中,这将使UI线程仍然响应

答案 1 :(得分:0)

你也必须中止线程。

public bool x = false;
public bool j = false;
private void Preiststop_Click(object sender, EventArgs e)
{
    j = true;
}
private void Preist_Click(object sender, EventArgs e)
{
    x = true;

    Thread newThread = new Thread(delegate ()
    {
        DoPriestWork();
    });

    newThread.Start();

    //loop to wait for the response from DoPriestWork thread
    while (x)
    {
        Thread.Sleep(5000);
        if (j)
            x = false;
    }

    newThread.Abort(); 
}
public void DoPriestWork()
{
    //x = true;
    //while (x == true)
    //{
    SendKeys.Send(" ");
    //Thread.Sleep(5000);
    //    if (j == true)
    //        x = false;
    //}
}

答案 2 :(得分:-1)

您的Preist_Click调用阻止了UI:它在同一个线程中执行,而不是自己开始。

试试这个:

private bool keepRunning = true;

private void Preiststop_Click(object sender, EventArgs e)
{
    keepRunning = false;
}

private async void Preist_Click(object sender, EventArgs e)
{
    keepRunning = true;
    await Task.Run(() => {
        while (keepRunning)
        {
            SendKeys.Send(" ");
            Thread.Sleep(5000);
        }
    });
}

答案 3 :(得分:-1)

似乎所有你需要的是一个线程,所以可以推动另一个按钮来改变“j”的条件。如果只有一个线程,则在该线程停止之前不会更新UI,因此需要创建另一个线程,如下例所示。

public Form1()
{
    InitializeComponent();

}

public bool x = false;
public bool j = false;
private void Preiststop_Click(object sender, EventArgs e)
{
    j = true;
}
private void Preist_Click(object sender, EventArgs e)
{
    Thread newThread = new Thread(DoPriestWork);
    newThread.Start();
}
public void DoPriestWork()
{
    x = true;
    while (x == true)
    {
        SendKeys.Send(" ");
        Thread.Sleep(5000);
        if (j == true)
            x = false;
    }
}