【问题标题】:Calling a Synchronous Timer from the Service Fabric Stateless Service从 Service Fabric 无状态服务调用同步计时器
【发布时间】:2017-03-09 19:32:56
【问题描述】:

我正在将我现有的工作角色逻辑转移到无状态服务。有一种方法可以使用 Thread.Sleep() 创建定时器功能。从 Stateless Service 的 RunAsync 方法调用此方法时,会引发警告。

protected override Task RunAsync(CancellationToken cancellationToken)
    {
        _backgroundService.Start();

        if (cancellationToken.IsCancellationRequested)
        {
            _backgroundService.Stop();
            cancellationToken.ThrowIfCancellationRequested();
        }

        return Task.FromResult(true);
    }

定时器方法如下。

public void Start()
    {

        _isStopping = false;

        while (!_isStopping)
        {
            try
            {
                ExecuteRepetitiveTask();
                Thread.Sleep(repeatDelaySeconds);
            }
            catch (Exception e)
            {
                Thread.Sleep(1000);
            }
        }

        _isStopping = false;
        _hasStopped = true;
    }

这是正确的,还是我需要将其转换为异步方法?

【问题讨论】:

  • 你是什么意思抛出警告?你能把它包括在你的帖子里吗?如果是编译时错误,那么我可以看到的一件事是,在 RunAsync 方法中,返回类型是 Task 但您正在返回 Task 您可以尝试将 Task.FromResult(true) 替换为 Task.Run(() = > {})
  • 警告与混合异步和非异步代码有关。 问:您是否使用计时器进行线程处理(这意味着唯一的原因)? 问: ExecuteRepetetiveTask 的签名是什么?真的是任务吗?我认为不会。

标签: c# asynchronous timer azure-service-fabric stateless


【解决方案1】:

这是因为 RunAsync 当前希望您的覆盖执行返回任务的异步工作。如果您运行纯同步代码,例如 Thread.Sleep,它将阻止底层状态机完成角色更改或打开您的服务副本/实例,这很糟糕,这就是您看到警告的原因。我们将在即将发布的版本中修复此问题,以便无论您的代码是否异步,它都能“正常工作”,但目前,只需将您的同步工作包装在 Task.Run() 中即可。

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-07-24
    • 1970-01-01
    • 2018-04-09
    • 2019-09-10
    相关资源
    最近更新 更多