我已经有一段时间没有这么困惑了。疯狂的是,我已经在代码的其他区域这样做了好几次,所以它几乎是完整的复制和粘贴,但除了这段代码无法正常工作。所以我不知何故错过了一些非常明显的东西。
public class RoomCache
{
private ConcurrentDictionary<string, List<string>> _dicOnlineTraders;
ILoggingService _logService = new LoggingService();
public RoomCache()
{
_dicOnlineTraders = new ConcurrentDictionary<string, List<string>>();
}
public void UpdateTraderCurrentRoom(string sRoom, string sTrader)
{
_dicOnlineTraders.AddOrUpdate(sRoom, new List<string>() { sTrader }, (x, y) => UpdateRoomOnlineTraderList(sTrader, y));
}
private List<string> UpdateRoomOnlineTraderList(string sTrader, List<string> aryTraderList)
{
try
{
if (!aryTraderList.Contains(sTrader))
aryTraderList.Add(sTrader);
return aryTraderList;
}
catch (Exception ex)
{
_logService.LogError(ex);
return aryTraderList;
}
}
}
上面的类在 Application_Start() global.asax.cs 中实例化,如下所示:
public static RoomCache RoomCache;
RoomCache = new RoomCache();
现在,在页面加载之间,我的字典不会保留调用 UpdateRoomOnlineTraderList 时添加到列表中的值。当我走过时,列表就在那里。下次我加载时 页面消失了,我 100% 没有其他方法可以从字典中删除这个值。
我的字典为什么不保留页面加载之间的值?键仍然保留,但值消失了。我很困惑。
最佳答案
如果您绝对确定其他地方没有重新初始化 RoomCache 或从中删除预期数据的代码,我最好的猜测是您有两个为 IIS 应用程序运行的 AppDomain...所以您实际上在一个 w3wp 工作进程下的两个不同的 AppDomain 中有两个静态 RoomCache。
您可以通过在 watch 或即时窗口中打印来自行检查:AppDomain.CurrentDomain.Id
如果两个页面加载实际上发生在不同的 AppDomain 中,则结果将是两个不同的 int 值。
一般来说,如果 ASP .NET 决定为您托管两个不同的 AppDomain,那么这符合您的最佳利益...因此,如果您确实需要跨页面加载可靠地持久保存信息,您可能会考虑为您的应用程序存储一个进程外存储。信息。
或者,您可以使用 web.config 来坚持 ASP .NET 将您的应用程序限制为仅一个 AppDomain。但是,如果 ASP .NET 决定在页面加载之间回收您的 AppDomain(这种情况可能经常发生),这仍然无法保护您。
关于C# 并发字典在页面加载之间不保存我的 List<string> 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060216/