从 Service Fabric 无状态服务调用同步计时器

Calling a Synchronous Timer from the Service Fabric Stateless Service

我正在将我现有的工作者角色逻辑移动到无状态服务。有一种使用 Thread.Sleep() 创建定时器功能的方法。从无状态服务的 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 当前期望您的覆盖执行返回任务的异步工作。如果您 运行 纯同步代码,例如 Thread.Sleep,它将阻止底层状态机完成角色更改或打开您的服务 replica/instance,这很糟糕,这就是为什么您会看到警告。我们将在即将发布的版本中修复此问题,以便 "just works" 无论您的代码是否异步,但暂时只需将您的同步工作包装在 Task.Run() 中。