我是服务结构的新手,首先查看涵盖该主题的 MSDN 文章。我首先在这里实现 Hello World 示例。
我将他们原来的 RunAsync 实现更改为:
var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<int, DataObject>>("myDictionary");
while (!cancellationToken.IsCancellationRequested)
{
DataObject dataObject;
using (var tx = this.StateManager.CreateTransaction())
{
var result = await myDictionary.TryGetValueAsync(tx, 1);
if (result.HasValue)
dataObject = result.Value;
else
dataObject = new DataObject();
//
dataObject.UpdateDate = DateTime.Now;
//
//ServiceEventSource.Current.ServiceMessage(
// this,
// "Current Counter Value: {0}",
// result.HasValue ? result.Value.ToString() : "Value does not exist.");
await myDictionary.AddOrUpdateAsync(tx, 1, dataObject, ((k, o) => dataObject));
await tx.CommitAsync();
}
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
我还介绍了一个 DataObject 类型并在该类型上公开了一个 UpdateDate 属性。
[DataContract(Namespace = "http://www.contoso.com")]
public class DataObject
{
[DataMember]
public DateTime UpdateDate { get; set; }
}
当我运行应用程序(Visual Studio 2015 中的 F5)时,在字典中找不到一个dataObject实例(键为 1),所以我创建一个,设置 UpdateDate,将其添加到字典并提交事务。在下一个循环中,它找到dataObject(键为 1)并设置 UpdateDate,更新字典中的对象并提交事务。完美的。
这是我的问题。当我停止并重新启动服务项目(Visual Studio 2015 中的 F5)时,我希望在我第一次迭代 RunAsync 时会找到 dataObject(键入为 1),但事实并非如此。我希望所有状态都被刷新到它的副本。
我是否必须为有状态服务执行任何操作才能将其内部状态刷新到其主副本?
从我读过的内容来看,这听起来好像所有这些都是由服务结构处理的,并且调用提交(在事务上)就足够了。如果我找到主副本(在 Service Fabric Explorer-> 应用程序视图中),我可以看到 RemoteReplicator_xxx LastACKProcessedTimeUTC 在我提交事务后更新(单步执行时)。
任何帮助是极大的赞赏。
谢谢!
-标记