如何在不等待其他方法完成的情况下从servicefabricactor获取状态?我有一个正在运行的服务,它迭代X个参与者,使用ActorProxy询问他们的状态。对我来说重要的是,在提醒回调中等待的actor中没有其他一些长时间运行的方法正在等待该服务。有没有一种方法可以调用下面的简单示例GetState()以允许该方法正确完成而不阻止某些提醒运行。Actor类:IMyActor{publicTaskGetState()=>StateManager。GetAsync("key")}替代。形成服务呼叫的正确方法是什么,如果它在5秒内没有回复,就包括在内。varproxy=ActorProxy.CreateGetCountsAsync(CancellationTokencancellationToken);}publicclassManyfoldActorService:ActorService,IManyfoldActorService{...}在Program.MainActorService中注册新的:ActorRuntime.RegisterActorAsync((context,actorType)=>newManyfoldActorService(context,actorType)).GetAwaiter().GetResult();假设我们有一个简单的Actor,其方法如下:TaskIManyfoldActor.SetCountAsync(intcount,CancellationTokencancellationToken){vartask=this.StateManager.SetStateAsync("count",count,cancellationToken);ActorEventSource.Current。ActorMessage(this,$"在{this.Id.GetLongId()}上完成设置{count}");回归任务;它等待30秒(模拟长时间运行、阻塞、方法调用),然后将状态值“count”设置为int。在一个单独的服务中,我们现在可以为Actors调用SetCountAsync来生成一些状态数据:长迭代=0;while(true){cancellationToken.ThrowIfCancellationRequested();迭代+=1;varactorId=iterations%10;varcount=Environment.TickCount%100;varmanyfoldActor=actorProxyFactory.CreateActorProxy(newActorId(actorId));manyfoldActor.SetCountAsync(count,cancellationToken).ConfigureAwait(false);ServiceEventSource.Current.ServiceMessage(this.Context,$"在{actorId}@{iterations}上设置计数{count}");awaitTask.Delay(TimeSpan.FromSeconds(3),cancellationToken);}}这个方法简单地循环以不断改变演员的价值。(注意总共10个actor之间的依赖关系,延迟3秒和延迟30秒的actor。简单这样设计是为了防止Actor调用无限累积等待锁)。每次调用也会执行即发即弃,因此我们可以在返回前继续更新下一个actor的状态。这是一段愚蠢的代码,它只是用这种方式来证明理论。现在在actor服务中,我们可以像这样实现GetCountsAsync方法:publicasyncTask>GetCountsAsync(CancellationTokencancellationToken){varactors=newDictionary();do{varpage=awaitthis.StateProvider.GetActorsAsync(100,continuationToken,cancellationToken);foreach(varactorinpage.Items){varcount=awaitthis.StateProvider.LoadStateAsync(actor,"count",cancellationToken);actors.Add(actor.GetLongId(),count);}continuationToken=page.ContinuationToken;}while(continuationToken!=null);回归演员;这使用底层的ActorStateProvider来查询所有已知的Actors(对于那个分区),然后直接读取每个这样的“绕过”Actor的状态,并且不会被actor的方法执行阻塞。最后一个块,一些可以调用我们的ActorService并在所有分区上调用GetCountsAsync:publicIDictionaryGet(){varapplicationName=FabricRuntime.GetActivationContext().ApplicationName;varactorServiceName=$"{typeof(IManyfoldActorService).Name.Substring(1)}";varactorServiceUri=newUri($"{applicationName}/{actorServiceName}");varfabricClient=newFabricClient();变种分区=新列表();varservicePartitionList=fabricClient.QueryManager.GetPartitionListAsync(actorServiceUri).GetAwaiter().GetResult();foreach(varservicePartitioninservicePartitionList){varpartitionInformation=servicePartition.PartitionInformationasInt64RangePartitionInformation;partitions.Add(partitionInformation.LowKey);}varserviceProxyFactory=newServiceProxyFactory();varactors=newDictionary();foreach(varpartitioninpartitions){varactorService=serviceProxyFactory.CreateServiceProxy(actorServiceUri,newServicePartitionKey(partition));varcounts=actorService.GetCountsAsync(CancellationToken.None).GetAwaiter().GetResult();foreach(varcountincounts){actors.Add(count.Key,count.Value);}}返回演员;}运行此代码现在将为我们提供10个actor,每33:d秒获取一次状态更新,每个actor每次忙30秒,Actor服务将在每个actor方法返回时看到更新的状态。这个例子中省略了一些东西,例如,当你在actor服务中加载状态时,我们应该防止超时。没有办法做到这一点。Actor是单线程的。如果他们在任何actor方法中等待长时间运行的工作完成,那么任何其他方法(包括来自外部的方法)都必须等待。以上就是C#学习教程:如何在不等待其他方法完成的情况下,从服务结构actor中获取状态?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: