Невозможно немедленно прервать цикл по нажатию кнопки c # mvc - PullRequest
0 голосов
/ 29 октября 2018

У меня есть метод действия mvc, где во время выполнения цикла я хочу остановить этот цикл в тот момент, когда нажимаю другую кнопку, поэтому я установил флаг и установил его в значение false, чтобы разорвать цикл.

bool flag = true;

public async Demo()
{
while(flag == true)
{
do something...
}
}

теперь при нажатии кнопки я вызываю один метод действия, чтобы остановить цикл while -

    public ActionResult StopLoop()  
    {  
        flag = false;
        Return View("Index")
    }  

Но это почти 100 минут, чтобы нажать на StopLoop после нажатия на кнопку.

почему? возможно, все они находятся на одной странице пользовательского интерфейса и имеют общий доступ homecontroller любой трюк я могу сделать?

У меня есть 2 кнопки на один запрос кнопки при запуске цикла, и я хочу на остановка цикла запроса на нажатие другой кнопки.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Если вы говорите, что один запрос запускает цикл while, и вы хотите, чтобы другой запрос остановил его, то это невозможно с ASP.NET MVC, так как он не имеет состояния. Как только представление возвращается, ваш цикл while больше не работает. В вашем случае, похоже, что метод StopLoop получает всего минуту. Вероятно, на самом деле происходит то, что ваш цикл while работает бесконечно, IIS его убивает, а затем обрабатывается запрос на остановку цикла.

0 голосов
/ 29 октября 2018

Если вы хотите запустить две задачи параллельно, вам нужно использовать новый поток для второй задачи, также вам нужно условно остановить второй поток.

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();
}

Вы можете увидеть больше информации об асинхронном программировании здесь Явное создание и запуск задач

и около Отмена задания


Обновление

если вы хотите сделать это в веб-приложении, вам нужно запустить вторую задачу в потоке, который не завершится после завершения запроса.

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);
            }
        }
...