C#按下按钮后退出循环

2 c# foreach

我有一个简单的C#foreach循环,当按下按钮时如何突破循环?它不在backgroundWorker线程中,因此我无法使用backgroundWorker.CancellationPending.

Sim*_*ens 5

在表单中创建一个布尔标志.将事件处理程序附加到按钮单击事件,并在事件处理程序中将标志设置为true.

检查循环中的标志,如果是,则调用"break".(更好的选择是使用while循环而不是for循环,并在while条件中检查标志)

显然,for循环需要在某种形式的后台线程上,否则GUI将不会响应.如果您不知道如何执行此操作,请查看ThreadPool.QueueUserWorkItemBackgroundWorker.如果您确实使用BackgroundWorker,则可以使用内置的CancelAsync()方法,而不是编写自己的取消标记.

[编辑:正如其他人所指出的那样(下文),并在这里这里进行更深入的讨论; 你需要在访问bool之前锁定或将其标记为volatile]

[在开始循环之前,不要忘记设置正确的标志状态.]

  • 显然,标志必须是易失性的,否则访问必须同步. (4认同)
  • 甚至布尔值,当从另一个线程访问时,需要`lock`(作为内存屏障)或`volatile`来**保证**它将被重新读取; 可以显示它在寄存器中卡住的示例:http://stackoverflow.com/questions/458173/can-ac-thread-really-cache-a-value-and-ignore-changes-to-that - 值-上其他个/ 458193#458193 (4认同)
  • efraim,为什么你需要同步访问一个简单的bool字段?用户不能很好地按下启动循环的按钮和同时取消它的按钮,可以吗? (3认同)