【发布时间】:2019-03-30 15:07:11
【问题描述】:
我正在尝试在服务结构有状态服务中实现取消任务功能。
计划正在使用取消令牌将通知传播到链接的线程/任务。
问题是,虽然有这些长时间运行的任务和线程在等待这个信号,但我不确定如何根据另一个 Web API 调用找到正确的取消令牌。
我正在考虑使用可靠的字典,然后甚至在尝试之前,我认为这会遇到死胡同,因为cancellationToken 无法序列化/反序列化。
请帮助我解决这个问题的好方法。
更新(我不想创建一个新线程丢失该线程中提到的一些重要上下文,所以在这篇文章中更新。)
确认下面的链接描述确实显示了可靠的服务和参与者方法可以支持取消令牌。然而,典型的用例是直接通过 Web API 接收取消请求,用户触发,例如点击刷新、转到另一个页面等。在这种情况下,完全相同的端点需要接收请求,而之前的 http 请求仍然存在一些长时间运行的任务或卡住。这不是这个线程中的场景。
对 IService/IActor 的 CancellationToken 支持
Reliable Service 和 Reliable Actor 方法现在支持可以通过 ActorProxy 和 ServiceProxy 远程访问的取消令牌,允许您实现协作取消。想要取消长时间运行的服务或参与者方法的客户端可以发出取消令牌的信号,并且取消意图将传播到参与者/服务方法。然后,该方法可以通过查看其取消令牌参数的状态来确定何时停止执行。
例如,一个参与者的合约可能有一个可能长时间运行的方法,可以如下建模:
public interface IPrimeNumberActorInterface : IActor
{
Task<ulong> FindNextPrimeNumberAsync
(ulong previous, CancellationToken cancellationToken);
}
希望取消方法执行的客户端代码可以通过取消取消令牌来传达其意图。
【问题讨论】:
标签: azure-service-fabric cancellationtokensource service-fabric-stateful cancellation-token