我有一个场景,当一个ASP.Net站点启动时,我需要覆盖一些应用程序设置(直到应用程序池重置之前,永远不要再次重写)。
以下是粗略的实现:
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”(对象名称、对象值)。
这意味着两个线程同时进入锁,或者设置“已完成”的应用程序设置没有生效。
有没有人有洞察力,或者有更好的方法来实现这一点?
发布于 2013-11-19 19:35:12
使锁定对象保持静态:
private static object _lockObject = new object();因为您可能创建了几个通过不同线程访问的该类实例,所以它们都有自己的锁对象。
这意味着不能“看到”对方锁。
https://stackoverflow.com/questions/20079996
复制相似问题