gpt4 book ai didi

c# - 我可以在 get 访问器中锁定集合吗?

转载 作者:太空狗 更新时间:2023-10-30 00:08:42 25 4
gpt4 key购买 nike

我有一个很少使用的字典,它几乎不会被阅读或更新,因为各个项目引发事件并返回它们的结果及其事件参数。事实上,线程总是会被同一个线程更新。为了安全起见,我正在考虑添加一个简单的锁。我想知道是否可以将锁放在 get 访问器中。这行得通吗?

        Dictionary<string,Indicator> indicators = new Dictionary<string,Indicator>();
Dictionary<string, Indicator> Indicators
{
get
{
lock (indicators)
{
return indicators;
}
}
}

public void AddIndicator(Indicator i)
{
lock (indicators)
{
indicators.Add(i.Name, i);
}
}

最佳答案

那并没有做任何特别有用的事情,不。

特别是,如果您有:

x = foo.Indicators["blah"]

然后索引器将在没有持有锁的线程的情况下执行...所以它不是线程安全的。把上面的代码想象成这样:

Dictionary<string, Indicator> indicators = foo.Indicators;
// By now, your property getter has completed, and the lock has been released...
x = indicators["blah"];

除了通过索引器访问它之外,您是否需要对集合做任何事情?如果不是,您可能只想用方法替换该属性:

public Indicator GetIndicator(string name)
{
lock (indicators)
{
return indicators[name];
}
}

(您可能想改用 TryGetValue 等 - 这取决于您要实现的目标。)

就我个人而言,我更愿意使用对私有(private)且未使用的锁对象的引用,而不是锁定集合引用,但这是另外一回事。

如其他地方所述,ConcurrentDictionary 是您的 friend 如果您使用的是 .NET 4,但当然在此之前它不可用:(

关于c# - 我可以在 get 访问器中锁定集合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412410/

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