gpt4 book ai didi

c# - .NET 中对象的锁定层次结构

转载 作者:行者123 更新时间:2023-11-30 21:23:44 25 4
gpt4 key购买 nike

我有一个代表“世界状况”的类。该类有许多其他对象的集合,这些集合又引用了更多对象和对象集合,有时甚至引用了它们在“世界层次结构”中的祖先。为了简化所说的,这里有一个例子(转换成 XML,细节省略):

<World>
<Country>
<City>
<Block>
...
</Block>
</City>
<City>
<Block>
...
</Block>
</City>
</Country>
...
<Country>
<City>
<Block> ... </Block>
...
<Block> ... </Block>
</City>
<City>
<Block> ... </Block>
</City>
</Country>
</World>

有两个线程,UI线程和后台线程(其实是服务器)。

服务器接收修改“世界状态”(添加城市、街区等)的消息。

UI 线程每隔一段时间使用 PictureBox 对象将世界状态绘制到屏幕上。表示层仅引用 IWorld 对象(World 实现),它无法访问其中的元素。

UI 线程应该锁定世界的完整 状态,这样世界就不会在绘制期间(由服务器)改变(这会导致世界图片不一致)。因为它只引用 IWorld 对象,所以这是唯一要锁定的对象。

我的问题是这个锁是否足够(即,递归地锁定该对象具有的所有字段和属性),或者应该单独锁定每个对象。解决这个问题的正确方法是什么?

注意:UI 无法联系服务器(这意味着它无法告诉服务器停止改变世界,然后在渲染后告诉它恢复)。

编辑:如果 World 和层次结构中的所有类实现 ILock 接口(interface),该接口(interface)提供 Lock() 方法,该方法将在所有较低级别(递归)调用 Lock(),这可能容易出现死锁(循环引用)或者太昂贵。

我想设计更改是有序的。

最佳答案

您不需要递归锁定 - 如果两个线程都锁定在同一个 IWorld 引用上,这就足以确保互斥性。

当然,锁定单个元素会给您带来更细粒度的锁定,但最终您可能会得到不一致的图片 - 我会想象您希望看到一整套更改一次从服务器。

然而,更好的模型通常是让服务器发布“快照”,然后创建世界的新副本并修改副本,在适当的时候将其变成快照。这样你就不需要这种互斥,当它想要在服务器改变它时绘制世界时它可能会阻塞你的 UI。

关于c# - .NET 中对象的锁定层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1592818/

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