我的一个用例需要在单个事件生成器的“start”和“stop”事件之间存储所有事件。我们将使用可靠的演员来处理这些数据,并在收到“停止”事件后进行总结。在开始和停止之间存储所有事件的直接方式是List类型。
// Init
var evts = new List<DataEvent>();
this.StateManager.TryAddStateAsync("events", evts);
// Fetch, add and save
var evts = this.StateManager.TryGetStateAsync<List<DataEvent>>("events");
evts.Add(newEvent);
this.StateManager.TrySaveStateAsync("events", evts);
根据我的理解,每次我获取现有列表时,添加一个新项并存储新的更新列表,StateManager将序列化/反序列化整个数组。我的理解是否正确?
什么是这个解决方案的一个很好的替代品?
答案 0 :(得分:5)
是的,您的理解是正确的。最好的方法是按原样处理状态管理器 - 键值存储,并使用可能是复合的键对不同的流进行分区。
答案 1 :(得分:2)
遵循here的建议:
A&#34;保存&#34;可以包括持久化到磁盘和复制,具体取决于 使用的设置。尚未修改的值不是 坚持或复制。如果未修改任何值,则保存 操作无效。
我建议使用像ImmutableList这样的不可变集合而不是列表,否则您的更改最终可能只会在内存中。
答案 2 :(得分:1)
您是否考虑过使用两种演员类型:
您的设备角色可以接收事件,为每个事件创建一个新的EventActor(存储有关每个事件的详细信息)并将HashSet保持在您的DeviceActor状态,每个EventActor一个。
另外,如果您需要更多信息来过滤事件:字典或元组,如果您需要在DeviceActor中直接需要更多信息而不调用它的子事件。