MVC4如何使用全局队列集合变量?

时间:2014-02-23 20:51:33

标签: asp.net-mvc queue

我做了一些调查,但我仍然无法弄清楚如何在不同的控制器中使用全局集合变量。在global.asax中,我放置了一个队列集(先进先出),但找不到从控制器中解决这个问题的方法。

public class MvcApplication : System.Web.HttpApplication
{
    public static Queue<SMS_PR> Production_FIFO;

    protected void Application_Start()
    {
        ...

        Production_FIFO = new Queue<SMS_PR>();
    }
}

2 个答案:

答案 0 :(得分:1)

您可以从控制器访问此变量:

public ActionResult Index()
{
    MvcApplication.Production_FIFO ...
}

这就是说,Queue<T>类不是线程安全的,所以如果多个用户访问此集合,那么尝试在多线程环境(如ASP.NET MVC应用程序)中执行此操作可能会导致异常。同时。

您可以考虑使用ConcurrentQueue<T>代替:

public class MvcApplication : System.Web.HttpApplication
{
    public static ConcurrentQueue<SMS_PR> Production_FIFO;

    protected void Application_Start()
    {
        ...

        Production_FIFO = new ConcurrentQueue<SMS_PR>();
    }
}

答案 1 :(得分:0)

MvcApplication中的类变量在控制器中不易显示。

如果将共享资源添加到Application集合,您将从所有控制器获得相同的实例。在Application_Start

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        Production_FIFO = new Queue<SMS_PR>();
        Application["SharedQueue"] = Production_FIFO;
    }
}

然后,从您的控制器:

public class MyController : System.Web.Controller
{
    protected ActionResult UseQueue()
    {
       var queue = Application["SharedQueue"];
       // use queue
    }
}

或者,您可以使用容器来保存队列(例如Unity或其他一些IoC容器)