服务结构状态服务-删除服务时取消令牌未设置为true

时间:2019-03-21 08:54:52

标签: azure-service-fabric service-fabric-stateful cancellation-token

我有一个StatefulService,它在RunAsync()方法中创建了一些任务(使用Task.Run()),但没有等待它们。 我有一个奇怪的问题,当我尝试手动删除群集中的服务时,并且我处于VS的调试模式时,取消令牌值未设置为true,并且RunAsync()继续执行。然后,在群集用户界面中得到以下警告:

The api ireplicator.changerole(n) on node is stuck 

是的,它被卡住了,但这仅仅是因为SF没有发送取消请求。

现在,最奇怪的事情是它不时发生,我无法追踪其原因。 如您所见,由于我正在调试RunAsync(),并且没有卡住,所以根本没有收到取消请求。

有什么想法吗? 我正在创建的任务是否有可能导致它?我看不到如何运行,尽管如果删除了这些任务,则看起来运行正常。 即使任务正在阻塞,RunAsync()也不会等待它们,应该将其取消,但是不会。

谢谢。

    protected override async Task RunAsync(CancellationToken cancellationToken)
    {
        StateManagerHolder.Instance = StateManager;
        while (true)
        {  
            Task.Run(() => DoSomething(), cancellationToken);
            await Task.Delay(45, cancellationToken);
        }
    }

1 个答案:

答案 0 :(得分:0)

好吧,问题似乎出在我的一项使用IReliableDictionary存储状态的任务中,好像我注释掉了一样,它按预期工作了。

由于我不知道自己在做什么错(做像docs这样的简单交易),并且根据: https://github.com/Azure/service-fabric-issues/issues/1139

我决定将服务转换为无状态并使用Azure表。 当然我现在没有遇到这个问题!