我有一个简单的C# foreach循环,当按下按钮时如何跳出循环?它不在backgroundWorker线程中,因此无法使用backgroundWorker.CancellationPending。
我有一个简单的C# foreach循环,当按下按钮时如何跳出循环?它不在backgroundWorker线程中,因此无法使用backgroundWorker.CancellationPending。
[编辑:正如其他人(下面)指出并在这里和这里中更深入地讨论的那样;您需要在访问布尔值之前锁定它或将其标记为易失性]
[不要忘记在开始循环之前设置标志的正确状态。]
lock
(作为内存屏障)或volatile
来保证其会被重新读取;否则可能会出现它被卡在寄存器中的示例:https://dev59.com/lHRB5IYBdhLWcg3w9Lvn#458193 - Marc Gravell这里有一个不太好的解决方案。
在每次循环迭代中调用Application.DoEvents()
。在按钮点击时将变量设置为True,在循环中检查该变量。如果为True,则跳出循环,否则继续执行。
正如我所说,这不是一个非常好的解决方案。Application.DoEvents()
可能非常危险。最好的选择是使用后台线程。
你可以像Aamir建议的那样使用DoEvents作为快速解决方案。
对于更可扩展和可维护的解决方案,您需要将工作移动到单独的线程中。然后,让按钮单击事件设置一个标志以停止循环就相当简单了。另一方面,需要更多的工作来将结果传递回UI线程。