在 C# 中处理无限循环退出的正确方法
本文关键字:方法 退出 无限循环 处理 | 更新日期: 2023-09-27 17:56:55
在我的应用程序中,我发现需要无限的while循环,主要是为了连续地执行一些重复的操作,除非发生另一个事件,所以我正在做的是
while(chkFlag)
{
//do something here which takes around 30 seconds
}
然后在其他一些事件中说按下按钮以停止循环我所做的
chkFlag = false;
现在这完成了工作,但问题是这不会立即停止循环,因为只有在循环完全执行后才会检查 chkFlag。所以任何人都可以告诉我如何根据事件立即退出循环。
"阻塞"代码应该被移动到某种工作线程中(可以终止和/或丢弃结果)。如果使用 BackgroundWorker (推荐,因为它使这变得简单),则有内置支持来处理取消操作。
然后,可以在后台工作线程中移动循环,或者工作线程的完成 (RunWorkerComplete) 事件可以触发下一个工作线程启动(这会导致隐式循环)。
快乐编码。
有更"激进"的方法来终止/发出线程信号;但建议这些方法需要比现在更多的信息。
你不能让它立即退出(好吧,你可以在新线程中运行循环并中止它,如果任何时候从中抛出异常真的很安全),但你可以在循环内的不同点分散if(!chkFlag) break;
可以安全退出。执行此操作的常用方法是使用 BackgroundWorker
或 CancellationToken
,而不是简单的布尔标志。
当然,它仍然需要在另一个线程中运行,以便 button 事件可以运行。BackgroundWorker 将自动处理此问题。
您正在寻找break;
.
我想,根据匿名的反对者,我应该详细说明。上面的语法将立即退出您所在的循环(它也适用于其他循环;可能值得注意的是,continue
存在以在开始时重新启动循环,这将在for
样式循环中执行增量逻辑)。
您决定如何执行break
取决于您,但它必须在循环本身内。
有多种方法可以做到这一点,例如在循环中检查事件并在发生时调用break;
。其他人已经注意到了BackgroundWorkers和Cancel Tokens的其他方法(这是首选,因为它不在循环中)。
使用一个新线程吗?你在循环中 30 秒做什么。听起来也许有更好的设计可以使用。
您是否考虑过使用计时器或设置事件处理程序?