我正在将现有的工作者角色逻辑移动到无状态服务。有一种方法可以使用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;
}
这是正确的,还是我需要将其转换为异步方法?
答案 0 :(得分:0)
这是因为RunAsync当前希望您的覆盖执行任务返回异步工作。如果您运行纯同步代码(如Thread.Sleep),它将阻止底层状态机完成角色更改或打开您的服务副本/实例,这很糟糕,这就是您看到警告的原因。我们正在即将发布的版本中对此进行修复,以便它能够正常运行。无论您的代码是否是异步的,但目前只需将同步工作包装在Task.Run()中。