我在这里读一篇文章 https://azure.microsoft.com/en-in/documentation/articles/service-fabric-work-with-reliable-collections/ 它说“一旦你把它交给一个可靠的集合,你就不能修改它。”
为什么会这样?我可以不修改对象并将其添加回可靠的集合中吗?它会不会覆盖以前的值吗?
答案 0 :(得分:1)
理论上,您可以修改同一个对象并将其写回可靠的集合。但这种方法很麻烦。对对象进行更改时,该值仅在本地修改,不会写入主副本副本的磁盘。直到您将修改后的对象显式写回可靠集合,对象的本地副本和持久化副本将不相同。因此,将对象视为不可变对象并对对象的深层副本进行修改总是一种很好的做法。
答案 1 :(得分:1)
在传统的.net集合中,字典中键控查找的值(或队列中的pop / peek)返回指向堆上对象的指针。修改此指针时,将修改堆中的值。结果,状态在字典中发生了变异。
可靠的馆藏是围绕更复杂的互动的立面。虽然集合确实在内存中*,但可靠的状态管理器还负责复制对辅助副本的任何更改。发生这种情况的机制是在ITransaction上调用CommitAsync。
如果您只是改变对象的内存表示形式,则永远不会将更改复制到辅助分区,并且将导致未定义/意外行为。 (例如,当活动主服务器切换到辅助服务器时)如果您确实调用了CommitAsync(即使您执行了Get - > Modify - > Set),事务可能无法提交,并且内存中的当前表示将不同于辅助分区和主分区的磁盘表示形式。这再次导致未定义/意外行为。
*在大多数情况下,除非集合的大小大于可用内存。在这种情况下,值从磁盘分页,只有密钥和最近使用的值保存在内存中。将来,当磁盘压力增加时,我已经听到有关在blob存储中进一步分页的讨论。
答案 2 :(得分:-2)
完整陈述是:
但是,对于可靠的集合,此代码展示了相同的内容 已经讨论过的问题:一旦你不能修改对象 给了它一个可靠的收藏。
该陈述涉及与处理可靠集合相关的问题。使用SF可靠字典时,API看起来像标准的.NET字典。在幕后,它更像是管理国家。通过这种差异化,我们需要在使用这些数据结构时牢记常见的陷阱。在第一个代码演示中,它看起来会更新对象但不会。在本文后面,它为您提供了修改可靠集合中对象的正确方法。