从 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() 中。
我正在将我现有的工作者角色逻辑移动到无状态服务。有一种使用 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() 中。