C# 如何在ASP MVC 4中启动和停止循环线程?
我正在开发一个简单的应用程序,它与Wirecast(一种流媒体软件)挂钩,并强制它每X秒更改一次源代码。我原以为这是学习ASP MVC 4的好方法,但我对它不太熟悉,遇到了一些问题。我希望用户能够通过选择单选按钮并点击“应用”或类似按钮来启用和禁用循环。开始循环工作正常,但我无法结束它。我尝试这样做的方式是创建一个运行循环的线程,当用户选择“启用循环”单选按钮时启动该线程,当用户选择“禁用循环”时中止该线程。我可以看到正在调用Abort方法,但线程仍在运行。相关代码如下:C# 如何在ASP MVC 4中启动和停止循环线程?,c#,multithreading,asp.net-mvc-4,loops,C#,Multithreading,Asp.net Mvc 4,Loops,我正在开发一个简单的应用程序,它与Wirecast(一种流媒体软件)挂钩,并强制它每X秒更改一次源代码。我原以为这是学习ASP MVC 4的好方法,但我对它不太熟悉,遇到了一些问题。我希望用户能够通过选择单选按钮并点击“应用”或类似按钮来启用和禁用循环。开始循环工作正常,但我无法结束它。我尝试这样做的方式是创建一个运行循环的线程,当用户选择“启用循环”单选按钮时启动该线程,当用户选择“禁用循环”时中止该线程。我可以看到正在调用Abort方法,但线程仍在运行。相关代码如下: public Thre
public Thread loop = new Thread(new ThreadStart(ThreadLoop));
[HttpPost]
public ActionResult Loop(Models.Loop model)
{
if (model.doLoop == true)
{
loop.Start();
}
else
{
loop.Abort();
}
return View();
}
public static void ThreadLoop()
{
object oWirecast = GetWirecast();
object oDocument = Late.Invoke(oWirecast, "DocumentByIndex", 1);
object oNormalLayer = Late.Invoke(oDocument, "LayerByName", "normal");
shotCount = (int)Late.Invoke(oNormalLayer, "ShotCount");
int shot = 0;
while (true)
{
shot = shot + 1;
if (shot > shotCount)
{
shot = shot % shotCount;
}
int shot_id = (int)Late.Invoke(oNormalLayer, "ShotIDByIndex", shot);
Late.Set(oNormalLayer, "ActiveShotID", shot_id);
Late.Invoke(oNormalLayer, "Go");
Thread.Sleep(3000);
}
}
所以,如果你发现这方面有任何问题,或者可以为我指出正确的方向,我希望你能帮助我。如果我能帮你什么忙,请告诉我。谢谢大家! ASP.NET MVC的DefaultControllerFactory不是线程安全的,每个请求都会创建一个新的控制器实例
看好吧,我以为事情就是这样的。因此,我是否能够在其他地方定义线程,然后从控制器访问它,这样就只有一个线程实例?您可以将
线程
定义为静态
。只要记住在访问它时使用正确的锁定。另外,Thread.Abort
通常不是一个好主意。相反,定义一个volatile bool
(如果线程是静态的,则也是静态的),每次运行循环时(在开始或结束时)都要检查该bool,如果设置为true,则退出循环(break;
)。这样你就可以干净地关闭线程。好吧,那么将线程定义为静态线程将允许我在多个控制器实例之间保持同一个实例?别介意我的最后一个问题,我自己测试了它。我只需要按照你说的做,停止使用Abort,而是切换bool来启动和暂停线程。非常感谢,@marc.d和@Alxandr!