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

C# 为什么我不能退出这个while循环?,c#,while-loop,C#,While Loop,我在试着制作一个能自动按空格的程序。 但我只能启用它。程序崩溃后 所以我不能关掉它。请帮忙 这是我的密码: using System.Windows.Forms; namespace Auto_Abillty { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public bool startFlag = false; pub

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

所以我不能关掉它。请帮忙

这是我的密码:

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;
        }
    }

}
}

您的
Preist\u单击
调用会阻止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);
        }
    });
}

看起来你所需要的只是一个线程,这样就可以按下另一个按钮来更改“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;
    }
}

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


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

您还必须中止该线程

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;
    //}
}

可能是因为您的UI被挂在while循环中,因此您无法单击另一个按钮将J转为True,因此您无法考虑创建一个线程来发送空格键。
thread.Sleep
正在阻止UI线程。查看使用
任务。延迟
async\await
。如果不需要仅每5秒检查一次,您可以查看自定义事件,直到您的代码仍在UI线程中执行它。您尚未启动新线程(尽管启动新线程也会出错;您应该在不使用任何新线程的情况下使代码异步)。@Servy-您是对的:我添加了
任务。运行
。。。对于回答者,现在您有了我已经提到的第二个问题,还有一个
async
方法,没有
wait
。为什么
wait
不会返回任何东西?处理可能的异常?是的,VS抱怨没有等待,但这并不是一个问题。既然你没有什么要等待的
,那么这个方法就不应该是
异步的
。程序仍然崩溃程序仍然崩溃,所以它不工作,但感谢你的帮助