Startup.cs:
Код: Выделить всё
services.AddHostedService();
Код: Выделить всё
public class BackgroundService: IHostedService
{
private CancellationTokenSource cts = new CancellationTokenSource();
public Task StartAsync(CancellationToken cancellationToken)
{
return RunTasks (cts.Token);
}
private List workersToRun = new List();
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();
}
}
Код: Выделить всё
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
}
}
Как правильно отменить все запущенные задачи и дождаться их завершения в методе StopAsync?
(весь код выше упрощен, на самом деле он содержит DI и обработку ошибок, но это не так актуально)
Подробнее здесь: https://stackoverflow.com/questions/681 ... tedservice