У меня есть 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 ?
нет, когда я нажимаю на стоп-флаг, значение флага не отображается как false в цикле while, поскольку это не статическая переменная, что мне делать, чтобы получить false в цикле while, когда я нажимаю на стоп. (если я сделаю переменную флага статической, она будет работать, но тогда все экземпляры становятся ложными)
удален flag = true из homecontroller.cs по-прежнему не удается установить false после остановки нажатия, почему?
Могу ли я использовать статическую переменную для потока на уровне контроллера и убить этот поток методом остановки?





Из ответа Бруно на ваш другой аналогичный вопрос:
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, чтобы лучше понять, что происходит между этими запросами.
Каждый раз, когда вы отправляете HTTP-запрос, MvcHandler создает новый контроллер. Это должно проиллюстрировать мою точку зрения выше: два объекта не связаны, и изменение переменной flag на одном не влияет на другой.
Поскольку суть вашего вопроса заключается в том, как запустить фоновую задачу в ASP.NET, вместо этого вам следует попробовать searching.
спасибо за подробное объяснение. могу ли я использовать два разных браузера? и использовать флаг статической переменной в таком случае, так как это будет два отдельных экземпляра?
MVC не имеет состояния. Попытка сохранить какие-либо данные (включая цикл while) между запросами приведет к сохранению состояния, что, возможно, плохо. Если вы хотите сделать это с отслеживанием состояния, вам нужно будет сделать это с помощью сеансовых или временных данных. Для того, что вы делаете, вы не можете сохранять контроллер для нескольких запросов. Это просто так не работает. Я бы порекомендовал вам создать службу Windows, которая запускает фоновую задачу (или прочитать некоторые другие параметры в отправленной мной ссылке), а затем общаться с этой службой. Затем вы можете отправить флаг службе, и она сможет запускать / останавливать цикл.
Другой возможный вариант - реализовать цикл с использованием JavaScript на клиенте. Но я не могу сказать, что это сработает наверняка.
потому что, если я использую статическую переменную, она работает, но когда она остановится, она остановится для всех, как вы сказали, я понял вашу точку зрения. любую простую ссылку на реализацию, которой вы можете поделиться или включить какой-либо фрагмент кода для mvc? это будет здорово заранее спасибо
Интересно, почему я не могу отследить идентификатор потока и сохранить его где-нибудь, например, в скрытом поле или временном интервале, и убить тот же поток, когда я нажимаю кнопку остановки?
Контроллеры создаются по запросу.
flagникогда не будетtrueдля другого запроса. Ваш актуальный вопрос «Как запустить фоновое задание из ASP.NET MVC и взаимодействовать с этим заданием»? Тогда сначала исследуйте это.