无法在按钮单击c#mvc时立即中断循环
我有mvc动作方法,其中while循环运行我想停止那个循环在另一个按钮上单击所以我保持一个标志并将其设置为false以打破循环。
bool flag = true; public async Demo() { while(flag == true) { do something... } }
现在点击按钮我正在调用一个动作方法来停止while循环 –
public ActionResult StopLoop() { flag = false; Return View("Index") }
但是点击按钮后点击这个StopLoop
几乎需要一分钟的时间。
为什么? 可能都在同一个UI页面上并共享同一个家庭homecontroller
我可以做的任何技巧?
我有一个按钮请求2个按钮,循环启动,我想要另一个按钮点击请求循环停止。
如果你说一个请求启动了while循环,并且你想要另一个请求来阻止它,那么ASP.NET MVC是不可能的,因为它是无状态的。 返回视图后,while循环不再运行。 在你的情况下,它看起来只是花了一分钟让StopLoop
方法被击中。 可能真正发生的事情是你的while循环可能无休止地运行,IIS杀死它,然后处理停止循环请求。
如果你想并行运行两个任务,你需要使用新线程进行第二个任务,你还需要有条件地停止第二个线程。
CancellationTokenSource TokenSource = new CancellationTokenSource(); CancellationToken Ct = TokenSource.Token; Task Demo = Task.Run(() => { do { Thread.Sleep(1000); Trace.Write("loop"); } while (!Ct.IsCancellationRequested); }, Ct); bool Flag = true; if (Flag) { TokenSource.Cancel(); }
您可以在此处查看有关异步编程的更多信息。 显式创建和运行任务
以及任务取消
更新
如果你想在Web应用程序中执行此操作,则必须在请求完成后不会终止的线程中运行第二个任务。
public class MvcApplication : System.Web.HttpApplication { static Task Demo = null; static CancellationTokenSource TokenSource = null; protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); TokenSource = new CancellationTokenSource(); CancellationToken Ct = TokenSource.Token; Demo = Task.Run(() => { do { Thread.Sleep(1000); Trace.Write("loop"); } while (!Ct.IsCancellationRequested); }, Ct); } public static void CancelLoop() { TokenSource.Cancel(); } }
并且您必须使用请求取消第二个任务(包含while循环)。 例如:
public class HomeController : Controller { public JsonResult ButtonPressed() { MvcApplication.CancelLoop(); return Json("canceled", JsonRequestBehavior.AllowGet); } }