【发布时间】:2019-08-12 02:07:55
【问题描述】:
我有一个StatefulService,它在RunAsync() 方法中创建了一些任务(使用Task.Run()),但不等待它们。
我有一个奇怪的问题,当我尝试手动删除集群中的服务,并且我在 VS 处于调试模式时,取消令牌值未设置为 true,并且 RunAsync() 继续执行。然后,在集群 UI 中收到以下警告:
The api ireplicator.changerole(n) on node is stuck
是的,卡住了,只是因为顺丰没有发送取消请求。
现在,最奇怪的是它时常发生,我无法追踪它的原因。
如您所见,我尊重取消令牌,因为我正在调试RunAsync(),它没有卡住,它根本没有收到取消请求。
有什么想法吗?
我正在创建的任务是否可能导致它?我看不出如何,虽然如果我删除这些任务,它看起来像预期的那样工作。
即使任务被阻塞,RunAsync() 也不会等待它们,应该被取消,但它不会。
谢谢。
protected override async Task RunAsync(CancellationToken cancellationToken)
{
StateManagerHolder.Instance = StateManager;
while (true)
{
Task.Run(() => DoSomething(), cancellationToken);
await Task.Delay(45, cancellationToken);
}
}
【问题讨论】:
-
如果cancellationToken被取消,循环会继续运行,因为你没有检查token是否已经被取消离开循环!
-
顺便问一下,你真的需要在每个循环中调用 DoSomething() 吗?
-
1.问题是CT没有取消。 2. 循环将停止,因为 Task.Delay 将抛出“任务被取消”异常。
标签: azure-service-fabric service-fabric-stateful cancellation-token