gpt4 book ai didi

c# - 'lock (this)'适契约(Contract)步每个成员函数吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:57 25 4
gpt4 key购买 nike

我有一个 Singleton 类,它高度依赖于用作数据库的 XML 文件。在构造函数中,读取 XML 文件并且 FileSystemWatcher 正在监视任何进一步的更改。

现在,如果发生任何更改,我将再次从 XML 文件中读取数据,但此时在重新加载 XML 文件之前,不应访问类函数。

我的问题是我可以简单地使用 this 作为同步对象(同时重新加载 XML 文件)并且不对函数进行任何更改而不是放置一个大的 锁定每个功能?

最佳答案

最好避免

lock(this) - 有一种极端情况,一些其他不相关的代码 也可能锁定它,甚至可能导致死锁。

更好的方法是:

private readonly object lockObj = new object();

然后 lock(lockObj) - 因为这是私有(private)的,所以您可以避免这种边缘情况。

另一种策略是将所有数据加载到一个不可变的封装对象中;然后您可以通过更新单个引用来交换所有内容;并且引用分配保证是原子的。这允许:

private SomeModel model;
public void Refresh() {
SomeModel newModel = new ...
// fully load etc
...
model = newModel;
}

如果您总是拍摄快照,则效果最佳,即代替

var foo = model.Foo;
var bar = model.Bar;

您使用:

var snapshot = model;
var foo = snapshot.Foo;
var bar = snapshot.Bar;

现在我们知道 Foo 和 Bar 来自同一个模型。

关于c# - 'lock (this)'适契约(Contract)步每个成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705672/

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