C#按下按钮后退出循环

时间:2009-08-03 11:32:40

标签: c# foreach

我有一个简单的C#foreach循环,当按下按钮时如何突破循环?它不在backgroundWorker线程中,所以我不能使用backgroundWorker.CancellationPending。

3 个答案:

答案 0 :(得分:5)

在表单中创建一个布尔标志。将事件处理程序附加到按钮单击事件,并在事件处理程序中将标志设置为true。

检查循环中的标志,如果是,则调用“break”。 (更好的选择是使用while循环而不是for循环,并在while条件中检查标志)

显然,for循环需要在某种形式的后台线程上,否则GUI将无法响应。如果您不知道如何操作,请查看ThreadPool.QueueUserWorkItemBackgroundWorker。如果您使用BackgroundWorker,则可以使用内置的CancelAsync()方法,而不是编写自己的取消标记。

[编辑:正如其他人所指出的那样(下文)并进行了更深入的讨论herehere;你需要先锁定才能访问bool或将其标记为volatile]

[不要忘记在开始循环之前设置正确的标志状态。]

答案 1 :(得分:4)

这是一个不太好的解决方案。

在循环的每次迭代中调用Application.DoEvents()。在按钮上单击将变量设置为True并在循环中检查该变量。如果确实如此,则继续打破。

正如我所说,这不是一个很好的解决方案。 Application.DoEvents()可能非常危险。这里最好的选择是拥有一个后台线程。

答案 2 :(得分:0)

您可以像Aamir建议的那样使用DoEvents作为快速解决方法。

对于更具伸缩性和可维护性的解决方案,您需要将工作移至单独的线程。然后,按钮单击事件设置一个标志来停止循环是相当简单的。另一方面,将结果传回UI线程还有一些工作要做。