【问题标题】:Thread safe global variable in an ASP.Net MVC applicationASP.Net MVC 应用程序中的线程安全全局变量
【发布时间】:2013-12-19 06:45:36
【问题描述】:

我需要在我的 ASP.Net MVC 应用程序中实现一个多线程全局变量。

ConcurrentDictionary<T> 是理想的选择,但如何让我的应用程序中的每个用户会话都可以访问它?

这样的东西可以解决问题吗?

public static class GlobalStore
{
    public static ConcurrentDictionary<string, DateTime> GlobalVar { get; set; }
}

我需要多个用户才能读取/写入此对象。

【问题讨论】:

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


    【解决方案1】:

    你可以像下面这样使用 HttpContext.current.Application

    创建对象

    HttpContext.Current.Application["GlobalVar"] = new ConcurrentDictionary<string, DateTime>();
    

    获取或使用对象

    ConcurrentDictionary<string, DateTime> GlobalVar = HttpContext.Current.Application["GlobalVar"] as ConcurrentDictionary<string, DateTime>;
    

    编辑:

    使用静态变量而不是如下属性编辑您的静态类

    public static class GlobalStore
    {
        public static ConcurrentDictionary<string, DateTime> GlobalVar;
    }
    

    现在在 global.aspx Application_Start 事件中使用新对象设置该变量,如下所示

    GlobalStore.GlobalVar = new ConcurrentDictionary<string, DateTime>();
    

    然后你可以在你的应用程序中使用它

        GlobalStore.GlobalVar["KeyWord"] = new DateTime();
    DateTime obj = GlobalStore.GlobalVar["KeyWord"] as DateTime;
    

    是的,ConcurrentDictionary 和静态变量在 .net 应用程序中都是线程安全的

    【讨论】:

    • 当你尝试在应用程序上添加更新操作时,你必须使用 Lock() , UnLoak() 方法。据我所知,它不是线程安全的。
    • msdn.microsoft.com/en-us/library/… 查看 Lock() UnLock() 的链接
    • 认为使用 ConcurrentDictionary 对象,您可能不需要锁定/解锁?
    • 你这样设置的静态变量将被所有用户共享。微软说静态变量是线程安全的,但静态变量的主要目的是它们在所有用户之间共享。所以它们在用户询问的方式中不是线程安全的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2015-07-07
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多