我试图在服务结构有状态服务中实现取消任务功能。
计划使用取消令牌将通知传播到链接的线程/任务。
问题是,当这些长期运行的任务和线程等待这个信号时,我不知道如何基于另一个Web调用找到正确的取消令牌。
我正在考虑使用可靠的字典,然后在尝试之前,我就认为这会陷入死胡同,因为cancellationToken不能序列化/反序列化。
请帮我解决这个问题。
更新(我不想创建一个新线程,失去这个线程中提到的一些重要上下文,所以在本文中进行更新)。
确认下面的链接描述确实显示了可靠的服务和参与者方法可以支持取消令牌。然而,典型的用例是通过web直接接收取消请求,用户触发时,如单击刷新、转到另一个页面等。在这种情况下,相同的端点需要接收请求,而先前的http requst则由于一些长时间运行的任务而徘徊或停滞不前。这不是这个线程中的场景。
CancellationToken对IService/IActor的支持
可靠服务和可靠代理方法现在支持可以通过ActorProxy和ServiceProxy远程处理的取消令牌,从而允许您实现协作取消。希望取消长期运行的服务或参与者方法的客户端可以向取消令牌发出信号,并且取消意图将传播到参与者/服务方法。然后,该方法可以通过查看其取消令牌参数的状态来确定何时停止执行。
例如,具有可能长期运行的方法的参与者契约可以建模如下所示:
        public interface IPrimeNumberActorInterface : IActor
        {
            Task<ulong> FindNextPrimeNumberAsync
                (ulong previous, CancellationToken cancellationToken);
        }希望取消方法执行的客户端代码可以通过取消取消令牌来传达其意图。
发布于 2018-10-25 23:21:57
CancellationToken & CancellationTokenSource是不可序列化的,不能在SF中跨服务调用或数据复制进行流。它只能用于告诉同一进程中的处理程序某个操作已被取消,并且在收到响应时应停止任何处理或忽略任何延续。
如果希望能够启动和取消另一个服务中的操作,则应将操作拆分为两个调用。
CancellationTokenSource,以生成一个要传递给在后台运行的任务\Thread的CancellationTokenCancellationTokenSource并取消它,以便提供给任何任务\线程的令牌可以停止任何处理,如果没有完成或取消。您可以简单地将其存储为运行任务的进程\分区中的Dictionary<Guid, CancellationTokenSource>。
如果您在SF中的多个分区中运行这些任务,并且计划将其存储在可靠字典中,这不是一个好主意,因为正如前面所说的,您不能将取消操作序列化到其他分区。
在这种情况下,您可以存储OperationID和PartitionID,这样所有分区都知道一个操作在哪里运行,当在任何分区上收到取消调用时,服务将在运行操作的可靠字典中查找,并将取消转发到正确的分区。
https://stackoverflow.com/questions/52998828
复制相似问题