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