Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 即使存在while(true)循环,也要停止GUI_C# - Fatal编程技术网

C# 即使存在while(true)循环,也要停止GUI

C# 即使存在while(true)循环,也要停止GUI,c#,C#,我无法停止我的应用程序,因为我有一个while循环,因此gui不允许我单击停止按钮,它看起来像: private void btnStart_Click(object sender, EventArgs e) { while(true) { //some code here } } //some methods here private void btnStop_Click(object sender, EventArgs e) { Application.

我无法停止我的应用程序,因为我有一个while循环,因此gui不允许我单击停止按钮,它看起来像:

private void btnStart_Click(object sender, EventArgs e)
{   while(true)
    { 
     //some code here
    }
}

//some methods here

private void btnStop_Click(object sender, EventArgs e)
{
 Application.Exit();
}

首先,如果您正在运行某种长时间运行的后台作业,那么您不应该在UI线程中执行此操作,因为正如您所述,您无法在UI线程中执行任何其他操作来停止循环。您需要将该工作延迟到辅助线程、计时器或UI线程上下文之外的其他线程。你可以用谷歌搜索很多不同的方法来实现这一点

其次,如果需要停止循环,则将循环的while条件从
true
更改为其他可监视的条件,例如,一个名为
keepRunning
的变量,然后可以从
btnStop\u单击
方法中设置该变量。当然,如果您采纳了我在第一点中的建议,那么可能有其他方法来停止
循环
的运行,例如,如果它是一个计时器,那么您可以以适当的方式停止该计时器


第三,在关闭应用程序之前,您应该等待后台操作停止。

首先,如果您正在运行某种长时间运行的后台作业,那么您不应该在UI线程中执行此操作,因为正如您所述,您无法在UI线程中执行任何其他操作来停止循环。您需要将该工作延迟到辅助线程、计时器或UI线程上下文之外的其他线程。你可以用谷歌搜索很多不同的方法来实现这一点

其次,如果需要停止循环,则将循环的while条件从
true
更改为其他可监视的条件,例如,一个名为
keepRunning
的变量,然后可以从
btnStop\u单击
方法中设置该变量。当然,如果您采纳了我在第一点中的建议,那么可能有其他方法来停止
循环
的运行,例如,如果它是一个计时器,那么您可以以适当的方式停止该计时器



第三,在关闭应用程序之前,您应该等待后台操作停止。

那么,为什么您首先有一个
while(true)
循环?while循环中有什么事情永远不会完成?请使用
计时器
异步/等待
。然后使用计时器或Backgroundworker,或者一个任务…一个
while(true)
通常在任何情况下都不是一个好主意,那么你需要研究异步编程,这样代码可以在不阻塞UI的情况下运行,并且可以被取消(通常通过取消令牌)。为什么你有一个
while(true)
首先循环?在while循环中,有什么事情是永远不会完成的?使用
计时器或
异步/等待
。然后使用计时器、Backgroundworker或任务…while(true)
通常在任何情况下都不是一个好主意,那么您需要研究异步编程,以便代码可以在不阻塞UI的情况下运行,并且可以被取消(通常通过取消令牌)。我认为
btnStop\u单击
根本不会触发,即使您将
while(true)
更改为
while(keepRunning)
不,这只是答案的一部分。第一部分是最重要的。您单击了一个按钮,该按钮调用了一个方法,但该方法仍然没有完成,因此在该方法完成之前,UI线程将不会侦听更多的输入,或者为此执行任何其他操作。从UI中调用的代码应该简短、快速,而长操作需要延迟到可以异步完成的地方。我完全同意。这就是为什么我建议第二部分不应该是答案的一部分,因为它不起作用:)异步执行并不一定意味着使用另一个线程。例如,Windows.Forms.Timer与UI在同一线程中执行。@Adrian我已经更新了帖子以反映这一点-不是想窃取你的想法,只是想让帖子更清晰以备将来使用。我认为即使你将
while(true)
更改为
while(keepRunning),点击
btnStop\u也不会触发
不,这只是答案的一部分。第一部分是最重要的。您单击了一个按钮,该按钮调用了一个方法,但该方法仍然没有完成,因此在该方法完成之前,UI线程将不会侦听更多的输入,或者为此执行任何其他操作。从UI中调用的代码应该简短、快速,而长操作需要延迟到可以异步完成的地方。我完全同意。这就是为什么我建议第二部分不应该是答案的一部分,因为它不起作用:)异步执行并不一定意味着使用另一个线程。例如,Windows.Forms.Timer与UI在同一线程中执行。@Adrian我更新了帖子以反映这一点-不是想窃取你的想法,只是想让帖子更清晰,以备将来使用