Как отправить переменную с новым измененным значением с # mvc или как убить поток по имени?

У меня есть mvc application, который является hosted on azure webapp

У меня есть простая кнопка запуска и кнопка остановки.

Когда вы нажимаете кнопку `` Пуск '', он отправляет сообщение в iot-концентратор

Когда вы нажимаете кнопку остановки, он перестает отправлять сообщения.

Я достигаю этого, используя значения флага bool true и false.

Теперь проблема в том, что когда я нажимаю кнопку остановки, он устанавливает флаг false, но не может отразить значение флага false в цикле while?

public class HomeController : Controller
    {
        bool flag;
        static Thread mythread;
         [HttpPost]
        public async Task<ActionResult> Start()
        {
           flag = true;
           if (messageType.Contains("demo1"))
            {
                mythread = new Thread(async () => await ProcessStart("data1",flag));
                thread.Start();
            }
            
        }
        
         private static async Task ProcessStart(string message,bool flag)
        {

            while (flag)
            {                

                    await deviceClient.SendEventAsync(message);
                
            }
        }
        
         [HttpPost]
        public ActionResult Stop()
        {
            mythread.Abort(); // still unable to kill started thread :(
            flag = false;
           return View("Index");
        }

but after stop click also flag value in while loop is true :( how ? I can not use static here as it will false all flag variable value gloably.

I wonder why can not i track thread id and save somewhere like in hidden field or temp and kill that same thread when i click on stop button ?

Контроллеры создаются по запросу. flag никогда не будет true для другого запроса. Ваш актуальный вопрос «Как запустить фоновое задание из ASP.NET MVC и взаимодействовать с этим заданием»? Тогда сначала исследуйте это.

CodeCaster 05.11.2018 16:52

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

Neo 05.11.2018 16:54

удален flag = true из homecontroller.cs по-прежнему не удается установить false после остановки нажатия, почему?

Neo 05.11.2018 17:08

Могу ли я использовать статическую переменную для потока на уровне контроллера и убить этот поток методом остановки?

Neo 05.11.2018 18:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
142
1

Ответы 1

Из ответа Бруно на ваш другой аналогичный вопрос:

If you're saying that one request starts the while loop, and you want another request to stop it, then that's not possible with a ASP.NET MVC as it is stateless. Once the view is returned your while loop is no longer running. In your case, it only looks like it's taking a minute for the StopLoop method to get hit. What's probably really happening is that your while loop is probably running endlessly, IIS kills it, and then the stop loop request is processed.

Повторим это другими словами: каждый раз, когда вы отправляете запрос, ваш контроллер создается как новый объект. Это означает, что частная переменная flag не используется этими объектами совместно. Во втором запросе, когда вы нажимаете кнопку «Конец», вы не взаимодействуете с тем же объектом контроллера, который использовался при нажатии кнопки «Пуск». Таким образом, установка флага на false при нажатии кнопки End не влияет на цикл while из предыдущего объекта контроллера.

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

MVC life cycle

Каждый раз, когда вы отправляете HTTP-запрос, MvcHandler создает новый контроллер. Это должно проиллюстрировать мою точку зрения выше: два объекта не связаны, и изменение переменной flag на одном не влияет на другой.


Поскольку суть вашего вопроса заключается в том, как запустить фоновую задачу в ASP.NET, вместо этого вам следует попробовать searching.

спасибо за подробное объяснение. могу ли я использовать два разных браузера? и использовать флаг статической переменной в таком случае, так как это будет два отдельных экземпляра?

Neo 05.11.2018 19:11

MVC не имеет состояния. Попытка сохранить какие-либо данные (включая цикл while) между запросами приведет к сохранению состояния, что, возможно, плохо. Если вы хотите сделать это с отслеживанием состояния, вам нужно будет сделать это с помощью сеансовых или временных данных. Для того, что вы делаете, вы не можете сохранять контроллер для нескольких запросов. Это просто так не работает. Я бы порекомендовал вам создать службу Windows, которая запускает фоновую задачу (или прочитать некоторые другие параметры в отправленной мной ссылке), а затем общаться с этой службой. Затем вы можете отправить флаг службе, и она сможет запускать / останавливать цикл.

Jack 05.11.2018 19:16

Другой возможный вариант - реализовать цикл с использованием JavaScript на клиенте. Но я не могу сказать, что это сработает наверняка.

Jack 05.11.2018 19:17

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

Neo 05.11.2018 19:19

Интересно, почему я не могу отследить идентификатор потока и сохранить его где-нибудь, например, в скрытом поле или временном интервале, и убить тот же поток, когда я нажимаю кнопку остановки?

Neo 05.11.2018 19:24

Другие вопросы по теме