【问题标题】:How can I start and stop a looping thread in ASP MVC 4?如何在 ASP MVC 4 中启动和停止循环线程?
【发布时间】:2023-03-30 01:57:01
【问题描述】:

我正在开发一个简单的应用程序,该应用程序连接到流媒体软件 Wirecast,并强制它每 X 秒更改一次源。我认为这对我来说是学习 ASP MVC 4 的好方法,但是我对它不是很熟悉,并且遇到了一些问题。我希望用户能够通过选择单选按钮并点击“应用”或类似的东西来启用和禁用循环。启动循环工作正常,但我无法结束它。我尝试这样做的方法是创建一个运行循环的线程,并在用户选择“启用循环”单选按钮时启动线程,并在他们选择“禁用循环”时中止线程。我可以看到 Abort 方法被调用,但线程仍在运行。相关代码如下:

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

所以,如果您发现这有任何问题,或者可以为我指明正确的方向,我希望您能提供帮助。如果我能以任何方式帮助你,请告诉我。谢谢!

【问题讨论】:

    标签: c# multithreading asp.net-mvc-4 loops


    【解决方案1】:

    ASP.NET MVC 的 DefaultControllerFactory 不是线程安全的,每个请求都会创建一个新的控制器实例

    http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx

    【讨论】:

    • 好的,我认为这就是正在发生的事情。那么我是否能够在其他地方定义线程,然后从控制器访问它,以便只有一个线程实例?
    • 您可以将Thread 定义为static。请记住在访问它时使用适当的锁定。此外,Thread.Abort 通常不是一个好主意。相反,定义一个volatile bool(如果线程是静态的),您每次运行循环(在开始或结束时)时检查它,如果它设置为true,则退出循环(break;)。这样你就干净地关闭了线程。
    • 好的,所以将线程定义为静态将允许我在多个控制器实例中保持相同的实例?
    • 别管我的最后一个问题,我自己测试过。我只需要按照你说的做并停止使用 Abort,而是切换一个 bool 来启动和暂停线程。非常感谢@marc.d 和@Alxandr!
    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多