首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在服务结构服务中存储取消令牌

在服务结构服务中存储取消令牌
EN

Stack Overflow用户
提问于 2018-10-25 22:12:18
回答 1查看 764关注 0票数 0

我试图在服务结构有状态服务中实现取消任务功能。

计划使用取消令牌将通知传播到链接的线程/任务。

问题是,当这些长期运行的任务和线程等待这个信号时,我不知道如何基于另一个Web调用找到正确的取消令牌。

我正在考虑使用可靠的字典,然后在尝试之前,我就认为这会陷入死胡同,因为cancellationToken不能序列化/反序列化。

请帮我解决这个问题。

更新(我不想创建一个新线程,失去这个线程中提到的一些重要上下文,所以在本文中进行更新)。

确认下面的链接描述确实显示了可靠的服务和参与者方法可以支持取消令牌。然而,典型的用例是通过web直接接收取消请求,用户触发时,如单击刷新、转到另一个页面等。在这种情况下,相同的端点需要接收请求,而先前的http requst则由于一些长时间运行的任务而徘徊或停滞不前。这不是这个线程中的场景。

来自链接:https://blogs.msdn.microsoft.com/azureservicefabric/2016/02/23/service-fabric-sdk-v1-5-175-and-the-adoption-of-virtual-machine-scale-sets/

CancellationToken对IService/IActor的支持

可靠服务和可靠代理方法现在支持可以通过ActorProxy和ServiceProxy远程处理的取消令牌,从而允许您实现协作取消。希望取消长期运行的服务或参与者方法的客户端可以向取消令牌发出信号,并且取消意图将传播到参与者/服务方法。然后,该方法可以通过查看其取消令牌参数的状态来确定何时停止执行。

例如,具有可能长期运行的方法的参与者契约可以建模如下所示:

代码语言:javascript
运行
复制
        public interface IPrimeNumberActorInterface : IActor
        {

            Task<ulong> FindNextPrimeNumberAsync
                (ulong previous, CancellationToken cancellationToken);

        }

希望取消方法执行的客户端代码可以通过取消取消令牌来传达其意图。

EN

Stack Overflow用户

回答已采纳

发布于 2018-10-25 23:21:57

CancellationToken & CancellationTokenSource是不可序列化的,不能在SF中跨服务调用或数据复制进行流。它只能用于告诉同一进程中的处理程序某个操作已被取消,并且在收到响应时应停止任何处理或忽略任何延续。

如果希望能够启动和取消另一个服务中的操作,则应将操作拆分为两个调用。

  • 第一个操作将生成要返回给客户端的操作ID,并为该操作创建一个CancellationTokenSource,以生成一个要传递给在后台运行的任务\Thread的CancellationToken
  • 第二个任务将接收和OperationID,并确定是否存在一个CancellationTokenSource并取消它,以便提供给任何任务\线程的令牌可以停止任何处理,如果没有完成或取消。

您可以简单地将其存储为运行任务的进程\分区中的Dictionary<Guid, CancellationTokenSource>

如果您在SF中的多个分区中运行这些任务,并且计划将其存储在可靠字典中,这不是一个好主意,因为正如前面所说的,您不能将取消操作序列化到其他分区。

在这种情况下,您可以存储OperationID和PartitionID,这样所有分区都知道一个操作在哪里运行,当在任何分区上收到取消调用时,服务将在运行操作的可靠字典中查找,并将取消转发到正确的分区。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52998828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档