0

我有一个自定义演员服务,我希望能够从这里向我的演员添加提醒,而不必为此直接调用演员。如果演员很忙,我不想等待排队,而是让它在需要时发出提醒。

我正在尝试使用 StateProvider.SaveReminderAsync 并且从函数摘要中说它应该完全按照我想要的方式工作.. 但它没有,而且我在网上找不到关于这个函数的单个示例。我一直在寻找 2 天,并尝试了很多事情来让它工作但没有运气。

谢谢你的帮助

    public class ActorReminderTestServices : ActorService, IActorReminderTestService, IService
    {
 
        public ActorReminderTestServices(StatefulServiceContext context,
                ActorTypeInformation actorTypeInfo,
                Func<ActorService, ActorId, ActorBase> actorFactory = null,
                Func<ActorBase, IActorStateProvider, IActorStateManager> stateManagerFactory = null,
                IActorStateProvider stateProvider = null,
                ActorServiceSettings settings = null)
                : base(context, actorTypeInfo, actorFactory, stateManagerFactory, stateProvider, settings)
        {
        }
         
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            await base.RunAsync(cancellationToken);
            #region Code to limit this to running just on 1 partition
            FabricClient _fabricClient = new FabricClient();
            System.Fabric.Query.ServicePartitionList _partitionList = await _fabricClient
                .QueryManager.GetPartitionListAsync(this.Context.ServiceName);
            System.Fabric.Query.Partition _1stPartition = _partitionList.OrderBy(a =>
                 (a.PartitionInformation as Int64RangePartitionInformation).LowKey).FirstOrDefault();

            if (this.Partition.PartitionInfo.Id != _1stPartition.PartitionInformation.Id)
            {
                return;
            }
            #endregion
            Task.Run(async () =>
            {
                await Task.Delay(10000);
                await this.CreateActors(cancellationToken);
            });
        }

        public async Task CreateActors(CancellationToken cancellationToken)
        {  
            try
            { 
                Guid _test2 = Guid.Parse("4C1DC22F-27DF-40C0-AD38-DC1971BDB281"); // {4C1DC22F-27DF-40C0-AD38-DC1971BDB281}
                ActorId _actor2 = new ActorId(_test2);
                // this function on the stateprovider.. how is this suppose to be used??
                // from looking at the SF source this object that is used in the actual actor
                // in an internal class, I tried creating my own version, but than the issues is it uses IActorManager
                // and that is internal.. how can I use this function.  I would like to loop through
                // all the actors and add a reminder to all of them with out having to call the actor directly
                await this.StateProvider.SaveReminderAsync(_actor2, new IActorReminder { Name = "testing", DueTime = TimeSpan.FromSeconds(1), Period = TimeSpan.FromSeconds(1), State = null }, cancellationToken);
             }
            catch (Exception ex)
            { 
            } 
        } 
    }
}
4

0 回答 0