【问题标题】:Service fabric stateful service - cancellation token is not set to true when service deleted服务结构有状态服务 - 删除服务时取消令牌未设置为 true
【发布时间】: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


【解决方案1】:

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

因为我不知道我做错了什么(像文档一样做一个简单的交易),并且根据: https://github.com/Azure/service-fabric-issues/issues/1139

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

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 2017-05-23
    • 2018-07-25
    • 2016-12-04
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多