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

时间:2016-10-27 07:52:45

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

我正在将现有的工作者角色逻辑移动到无状态服务。有一种方法可以使用Thread.Sleep()创建Timer功能。从无状态服务的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;
    }

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

1 个答案:

答案 0 :(得分:0)

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