gpt4 book ai didi

c# - 在 ASP.NET 中在运行时创建动态锁

转载 作者:太空狗 更新时间:2023-10-29 18:36:07 26 4
gpt4 key购买 nike

以下假设是否适用于此代码?我在代码下面放了一些背景信息,但我认为它不相关。

假设 1:由于这是一个单一的应用程序,我假设它将由一个单一的进程处理。因此,静态变量在线程之间共享,并且静态声明我的锁对象集合是有效的。

假设 2:如果我知道该值已经在字典中,则不需要锁定读取。我可以使用 ConcurrentDictionary,但我相信这个是安全的,因为我没有枚举(或删除),并且当我调用 UnlockOnValue() 时,该值将存在并且不会改变。

假设 3:我可以锁定 Keys 集合,因为该引用不会更改,即使基础数据结构发生更改也是如此。

private static Dictionary<String,Object> LockList = 
new Dictionary<string,object>();

private void LockOnValue(String queryStringValue)
{
lock(LockList.Keys)
{
if(!LockList.Keys.Contains(queryStringValue))
{
LockList.Add(screenName,new Object());
}
System.Threading.Monitor.Enter(LockList[queryStringValue]);
}
}

private void UnlockOnValue(String queryStringValue)
{
System.Threading.Monitor.Exit(LockList[queryStringValue]);
}

然后我会像这样使用这段代码:

LockOnValue(Request.QueryString["foo"])
//Check cache expiry
//if expired
//Load new values and cache them.
//else
//Load cached values
UnlockOnValue(Request.QueryString["foo"])

背景:我正在 ASP.NET 中创建一个应用程序,它根据查询字符串中的单个用户定义变量下载数据。值的数量将非常有限。我需要在指定的时间段内缓存每个值的结果。

方法: 我决定使用本地文件来缓存数据,这不是最好的选择,但我想尝试一下,因为这不是关键,而且性能也不是大问题。我为每个选项使用了 2 个文件,一个包含缓存到期日期,另一个包含数据。

问题:我不确定最好的锁定方法是什么,而且我对 .NET 中的线程问题也不太熟悉(我选择这种方法的原因之一)。根据可用的内容和我阅读的内容,我认为以上内容应该可行,但我不确定并希望获得第二意见。

最佳答案

您当前的解决方案看起来很不错。我要改变的两件事:

1:UnlockOnValue 需要进入 finally block 。如果抛出异常,它永远不会释放它的锁。

2:LockOnValue 有点低效,因为它会进行两次字典查找。这对于小型字典来说不是什么大问题,但对于较大的字典,您需要切换到 TryGetValue。

此外,您的假设 3 成立 - 至少目前如此。但是 Dictionary 协定不保证 Keys 属性总是返回相同的对象。而且由于不依赖它很容易,所以我建议不要这样做。每当我需要一个对象来锁定时,我只是为此目的创建一个对象。像这样的东西:

private static Object _lock = new Object();

关于c# - 在 ASP.NET 中在运行时创建动态锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617616/

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