gpt4 book ai didi

c# - 保存用户消息的静态字典

转载 作者:行者123 更新时间:2023-12-02 05:26:35 25 4
gpt4 key购买 nike

我创建了一个静态类来保存用户消息,例如“项目已成功添加”或“密码已成功更改”等。类内部是一个静态字典,其中包含所有消息。字典的键是 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; }
}

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

最佳答案

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

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

关于c# - 保存用户消息的静态字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12994741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com