用于保存用户消息的静态字典

And*_*rew 2 c# queue asp.net-mvc static dictionary

我创建了一个静态类来保存用户消息,例如"项目成功添加"或"密码成功更改"等.在类中是一个包含所有消息的静态字典.字典的关键是UserId.然后我有一个Action在_Layout.cshtml中呈现,这样即使消息被重定向到页面外,消息也会跟随用户.

例如,我可能允许用户"添加"项目,然后一旦项目成功添加,它将重定向到该项目的"列表"页面,然后显示消息"项目已成功添加".

这很有效,直到我部署到我的生产网站,我注意到消息"滞后".我会添加一个项目,然后它将重定向到列表页面,但不会显示该消息.然后我会导航到应用程序中的其他位置,然后消息将显示在该页面上.

有什么想法会发生这种情况吗?

这是我的UserMessageManager的代码

public static class UserMessageManager
{
    private static readonly Dictionary<int, Queue<UserMessage>> UserMessages = new Dictionary<int, Queue<UserMessage>>();

    public static void Add(int userId, string message)
    {
        if (string.IsNullOrWhiteSpace(message))
            return;

        if (!UserMessages.Keys.Contains(userId))
        {
            UserMessages.Add(userId, new Queue<UserMessage>());
        }

        UserMessages[userId].Enqueue(new UserMessage { Message = message});
    }

    public static List<UserMessage> Get(int userId)
    {
        if (!UserMessages.Keys.Contains(userId))
        {
            UserMessages.Add(userId, new Queue<UserMessage>());
        }

        var messages = new List<UserMessage>();
        while (UserMessages[userId].Any())
        {
            messages.Add(UserMessages[userId].Dequeue());
        }

        return messages;
    }
}

public class UserMessage
{
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

编辑:经过一些游戏,消息有时甚至会"束缚".我会在创建一些"项目"之后向字典添加消息,并且消息将在看似随机的时间突然全部显示.

Jon*_*eet 5

首先,如果这是一个真实的网站,我不会采取这种方法.如果您希望持久保存信息,请使用持久性内容(例如数据库).否则,当AppDomain被回收或整个服务器出现故障时(你确实有冗余,对吗?),你将失去所有的消息.这种方法也不能很好地平衡负载.

其次,您可能会看到标准集合类的结果不是线程安全的.没有任何同步或其他内存障碍,一个线程可能没有看到另一个线程写入的数据.两个线程完全可以同时写入字典(或写入同一列表).您可以添加一些同步,例如,拥有一个锁定对象并锁定每个方法的整体.我开始使用数据库,但......