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

时间:2011-05-20 03:48:59

标签: c# winforms

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

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

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

chkFlag = false;

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

4 个答案:

答案 0 :(得分:4)

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

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

快乐的编码。


有更多“积极”的方式来终止/发信号通知线程;但建议这些信息需要的信息比现有的更多。

答案 1 :(得分:1)

您正在寻找break;

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

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

有多种方法,例如在循环中放置对事件的检查,如果发生则调用break。其他人已经注意到BackgroundWorkers和Cancel Tokens的其他方法(这是首选,因为它不在循环中)。

答案 2 :(得分:1)

你不能让它立即退出(好吧,你可以在一个新线程和Abort中运行循环,如果在任何时候从它抛出异常是非常安全的),但是你可以在循环内的各个点散布if(!chkFlag) break;,可以安全退出。通常的方法是使用BackgroundWorkerCancellationToken而不是简单的布尔标志。

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

答案 3 :(得分:0)

您是否可以使用新线程?你在循环中做了30秒的事情。听起来好像有更好的设计可供使用。

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