在 C# 中处理无限循环退出的正确方法



在我的应用程序中,我发现需要无限的while循环,主要是为了连续地执行一些重复的操作,除非发生另一个事件,所以我正在做的是

while(chkFlag)
{
   //do something here which takes around 30 seconds
}

然后在其他一些事件中说按下按钮以停止循环我所做的

chkFlag = false;

现在这完成了工作,但问题是这不会立即停止循环,因为只有在循环完全执行后才会检查 chkFlag。所以任何人都可以告诉我如何根据事件立即退出循环。

"阻塞"代码应该被移动到某种工作线程中(可以终止和/或丢弃结果)。如果使用 BackgroundWorker (推荐,因为它使这变得简单),则有内置支持来处理取消操作。

然后,可以在后台工作线程中移动循环,或者工作线程的完成 (RunWorkerComplete) 事件可以触发下一个工作线程启动(这会导致隐式循环)。

快乐编码。


有更"激进"的方法来终止/发出线程信号;但建议这些方法需要比现在更多的信息。

你不能让它立即退出(好吧,你可以在新线程中运行循环并中止它,如果任何时候从中抛出异常真的很安全),但你可以在循环内的不同点分散if(!chkFlag) break;可以安全退出。执行此操作的常用方法是使用 BackgroundWorkerCancellationToken,而不是简单的布尔标志。

当然,它仍然需要在另一个线程中运行,以便 button 事件可以运行。BackgroundWorker 将自动处理此问题。

您正在寻找break; .

我想,根据匿名的反对者,我应该详细说明。上面的语法将立即退出您所在的循环(它也适用于其他循环;可能值得注意的是,continue存在以在开始时重新启动循环,这将在for样式循环中执行增量逻辑)。

您决定如何执行break取决于您,但它必须在循环本身内。

有多种方法可以做到这一点,例如在循环中检查事件并在发生时调用break;。其他人已经注意到了BackgroundWorkers和Cancel Tokens的其他方法(这是首选,因为它不在循环中)。

你想

使用一个新线程吗?你在循环中 30 秒做什么。听起来也许有更好的设计可以使用。

您是否考虑过使用计时器或设置事件处理程序?

最新更新