C# 并发字典在页面加载之间不保存我的 List<string> 值

标签 c# concurrentdictionary

我已经有一段时间没有这么困惑了。疯狂的是,我已经在代码的其他区域这样做了好几次,所以它几乎是完整的复制和粘贴,但除了这段代码无法正常工作。所以我不知何故错过了一些非常明显的东西。

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/

相关文章:

c# - 在修改值时循环遍历 ConcurrentDictionary

c# - 并发的ToLookup()转换?

c# - Pinvoke-使用指向指针参数的指针来调用函数

c# - 表单中的代码执行停止

c# - 带有显示错误的 Internet 代理服务器的 Windows WCF 客户端服务器违反了协议(protocol)。部分=响应状态行

c# - .NET ConcurrentDictionary.ToArray() 参数异常

c# - 批量操作如何影响 ConcurrentDictionary?

c# - 带有 ISAPI 文件夹的命名空间标准

c# - 如何使用 lambda 表达式在 C# 中查找两个 LIST<object> 的区别

c# - 在 C# 中尝试从 ConcurrentDictionary 中删除键值对