Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务结构-存储列表<;T>;在StateManager中寻找可靠的演员_C#_Azure Service Fabric_Service Fabric Stateful_Service Fabric Actor - Fatal编程技术网

C# 服务结构-存储列表<;T>;在StateManager中寻找可靠的演员

C# 服务结构-存储列表<;T>;在StateManager中寻找可靠的演员,c#,azure-service-fabric,service-fabric-stateful,service-fabric-actor,C#,Azure Service Fabric,Service Fabric Stateful,Service Fabric Actor,我的一个用例要求存储来自单个事件生成器的“开始”和“停止”事件之间的所有事件。我们将使用可靠的参与者处理这些数据,并在收到“停止”事件后进行总结。存储开始和停止之间的所有事件的直接方法是在类型列表中 // Init var evts = new List<DataEvent>(); this.StateManager.TryAddStateAsync("events", evts); // Fetch, add and save var evts = this.StateManag

我的一个用例要求存储来自单个事件生成器的“开始”和“停止”事件之间的所有事件。我们将使用可靠的参与者处理这些数据,并在收到“停止”事件后进行总结。存储开始和停止之间的所有事件的直接方法是在类型列表中

// 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);
//初始化
var evts=新列表();
this.StateManager.tryaddstateAync(“事件”,evts);
//获取、添加和保存
var evts=this.StateManager.tryGetStateAncy(“事件”);
evts.Add(新事件);
this.StateManager.TrySaveStateAsync(“事件”,evts);
据我所知,每次获取现有列表、添加新项并存储新更新的列表时,StateManager都会序列化/反序列化整个数组。我的理解正确吗


那么,除了这个解决方案,还有什么好的替代方案呢

是的,你的理解是正确的。最好的方法是按原样对待状态管理器-键值存储,并按可以组合的键对不同的流进行分区。

以下是来自以下方面的建议:

“保存”可以包括持久化到磁盘和复制,具体取决于 使用的设置。未修改的值不会被删除 持久化或复制。如果未修改任何值,则保存 手术什么也不做


我建议使用不可变的集合,如而不是列表,否则您的更改可能最终只会出现在内存中。

您是否考虑过使用两种参与者类型:

  • 设备执行器
  • 事件主角
您的设备参与者可以接收事件,为每个事件创建一个新的EventActor(存储关于每个事件的详细信息),并在DeviceActor状态下保留一个HashSet,每个EventActor一个


或者,如果您需要更多信息来过滤事件:字典,或者元组,如果您需要更多信息,直接在DeviceActor中进行过滤,而不需要调用其子组件。

谢谢您的确认。我的流是分区的,每个参与者将处理一个设备,但是我需要在每个参与者中存储一系列事件,以便能够计算摘要。这是一个非常好的观点。ATM我想每个数组元素有一个状态键,并保持元素计数器处于一个状态。我还将有一个数组的本地副本,所以我只需要在某个参与者由于某种原因被激活的情况下逐个元素读取这个状态数组。