C# 如何为BackgroundService的ExecuteAsync设置超时?
我有一个名为Worker的后台服务,我覆盖了ExecuteAsync方法,每10秒运行一次。有时候,我跑步的时间很长。在这个场景中,我想杀死我正在运行的东西,然后重新运行它。我怎样才能做到这一点 我的背景服务如下:C# 如何为BackgroundService的ExecuteAsync设置超时?,c#,.net-core,C#,.net Core,我有一个名为Worker的后台服务,我覆盖了ExecuteAsync方法,每10秒运行一次。有时候,我跑步的时间很长。在这个场景中,我想杀死我正在运行的东西,然后重新运行它。我怎样才能做到这一点 我的背景服务如下: public class Worker : BackgroundService { private readonly ITask task; private readonly IHostApplicationLifetime appLifeTi
public class Worker : BackgroundService {
private readonly ITask task;
private readonly IHostApplicationLifetime appLifeTime;
public Worker(ITask task, IHostApplicationLifetime appLifeTime) {
this.task = task;
this.appLifeTime = appLifeTime;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
while (!stoppingToken.IsCancellationRequested)
{
try {
this.task.Execute(stoppingToken);
} catch (Exception e) {
this.appLifeTime.StopApplication();
}
await Task.Delay(10000, stoppingToken);
}
}
}
public interface ITask {
void Execute(CancellationToken stoppingToken);
}
您可以按照以下思路做一些事情:
protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
var cancellationSource = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken);
cancellationSource.CancelAfter(10000);
return Task.Run(() => task.Execute(cancellationSource.Token));
}
如果您想处理执行和/或等待任务,那么您可以,但这是一个简单的示例。传递一个CancellationToken,该Token将在X时间后取消。将其与主机的停止令牌相结合。检查已取消的令牌,然后停止应用程序或重试。显然,只有当您的任务真正尊重令牌时,才能工作…CancellationTokenSource具有CancelAfter()方法。Execute确实需要返回一个您可以等待的任务,而不是使IMO无效。事情变得更容易了,但这不会停止主任务。它仍将继续处理,因为它没有被告知取消。对不起,我过于简单化了。我还编辑了答案,我认为如果
ITask.Execute
方法返回了Task
Oops错过了方法签名中的空白会更好。。。但是现在,如果主机stopsOne可以使用CancellationTokenSource.CreateLinkedTokenSource
链接取消令牌(如果需要),那么这两个任务都不会停止。我不想在这里给出太多细节,因为这实际上取决于用户的情况。