首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用appSettings跟踪是否完成时,线程锁定没有正常运行

使用appSettings跟踪是否完成时,线程锁定没有正常运行
EN

Stack Overflow用户
提问于 2013-11-19 19:09:04
回答 1查看 46关注 0票数 0

我有一个场景,当一个ASP.Net站点启动时,我需要覆盖一些应用程序设置(直到应用程序池重置之前,永远不要再次重写)。

以下是粗略的实现:

代码语言:javascript
复制
        private object _lockObject = new object();

        private void OverrideSettings()
        {
            if (!ConfigurationUtility.GetAppSettingsValue<bool>(SETUPCOMPLETEAPPSETTINGKEY))
            {
                lock (_lockObject)
                {
                    if (!ConfigurationUtility.GetAppSettingsValue<bool>(SETUPCOMPLETEAPPSETTINGKEY))
                    {
                        // snip...
                        ConfigurationManager.AppSettings.Set(SETUPCOMPLETEAPPSETTINGKEY, bool.TrueString);    
                    }
                }
            }
        }

通常,这很好,但偶尔(在加载和应用程序池重置时)我会收到以下消息:

异常信息:异常类型: ArgumentException异常消息: Item已经添加。字典中的键:在System.Collections.Specialized.NameObjectCollectionBase.BaseAdd(String 203中添加“OverrideOfAppSettingsComplete”键:在c:\Modules\LoadOverriddenSiteSettingsModule.cs:line 203中在System.Collections.Hashtable.Insert(对象键、对象nvalue、布尔添加)处添加“OverrideOfAppSettingsComplete”(对象名称、对象值)。

这意味着两个线程同时进入锁,或者设置“已完成”的应用程序设置没有生效。

有没有人有洞察力,或者有更好的方法来实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 19:35:12

使锁定对象保持静态:

代码语言:javascript
复制
private static object _lockObject = new object();

因为您可能创建了几个通过不同线程访问的该类实例,所以它们都有自己的锁对象。

这意味着不能“看到”对方锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20079996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档