【问题标题】:Static dictionary to hold user messages保存用户消息的静态字典
【发布时间】:2012-10-11 06:39:47
【问题描述】:

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

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

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

任何想法为什么会发生这种情况?

这是我的 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; }
}

编辑:经过一番玩弄之后,消息有时甚至会“聚集”起来。创建几个“项目”后,我将向字典添加一条消息,这些消息会突然在看似随机的时间同时显示。

【问题讨论】:

    标签: c# asp.net-mvc dictionary static queue


    【解决方案1】:

    首先,如果这是针对真实网站的,我无论如何都不会采用这种方法。如果您希望信息持久化,请使用持久化的东西(例如数据库)。否则,当 AppDomain 被回收或整个服务器出现故障时(您确实有冗余,对吗?)您将丢失所有消息。这种方法也不能很好地进行负载平衡。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2014-12-25
      • 2020-03-30
      • 2014-04-14
      • 2010-11-21
      • 2013-02-10
      • 2020-05-01
      相关资源
      最近更新 更多