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抱怨没有等待,但这并不是一个问题。既然你没有什么要等待的
,那么这个方法就不应该是异步的。程序仍然崩溃程序仍然崩溃,所以它不工作,但感谢你的帮助