繁体   English   中英

C#按下按钮后退出循环

[英]C# Break out of loop on button press

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

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

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

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

[编辑:正如其他人所指出的那样(下文),并在这里这里进行更深入的讨论; 你需要在访问bool之前锁定或将其标记为volatile]

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

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

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

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

您可以像Aamir建议的那样使用DoEvents作为快速修复。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM