我创建了一个 ASP.NET 核心 API,但我不知道如何正确实现 IHostedService。我有几个“工人”类需要作为后台进程运行,所以我使用 IHostedService 来异步启动所有任务。
启动.cs:
services.AddHostedService<BackgroundService>();
背景服务.cs:
public class BackgroundService: IHostedService
{
private CancellationTokenSource cts = new CancellationTokenSource();
public Task StartAsync(CancellationToken cancellationToken)
{
return RunTasks (cts.Token);
}
private List<IWorker> workersToRun = new List<IWorker>();
private Task RunTasks(CancellationToken cancellationToken)
{
try
{
Worker1 w1 = new Worker1(); //Implements IWorker
workersToRun.Add(Task.Run(() => w1.DoWork(cancellationToken)));
Worker1 w2 = new Worker2(); //Implements IWorker
workersToRun.Add(Task.Run(() => w2.DoWork(cancellationToken)));
Task.WhenAll(workersToRun.ToArray());
return Task.CompletedTask;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
throw;
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
try
{
cts.Cancel();
}
finally
{
//Wait for all started workers/tasks to complete ??????
}
return Task.CompletedTask;
}
public virtual void Dispose()
{
cts.Cancel();
cts.Dispose();
}
}
工人.cs
public interface IWorker
{
Task DoWork(CancelationToken token)
}
public class Worker1 : IWorker
{
public Task DoWork(CancelationToken token)
{
while (!token.IsCancellationRequested)
{
return Task.Delay(1000);
//Do some random stuff in the background
}
//cleanup
}
}
public class Worker2 : IWorker
{
public async Task DoWork(CancelationToken token)
{
while (!token.IsCancellationRequested)
{
await Task.Delay(1000);
//Do some random async stuff in the background
}
//cleanup
}
}
工人类似乎工作(基于日志),但 cancelationToken 没有,所以清理代码永远不会执行(似乎)。如何正确取消所有正在运行的任务并在 StopAsync 方法中等待它们完成?
(上面的所有代码都被简化了,它实际上包含 di 和错误处理,但这不相关)