我做了一些调查,但我仍然无法弄清楚如何在不同的控制器中使用全局集合变量。在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>();
}
}
答案 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容器)