Как запускать и останавливать задачи в IHostedServiceC#

Место общения программистов C#
Ответить
Anonymous
 Как запускать и останавливать задачи в IHostedService

Сообщение Anonymous »

Я создал веб-API ASP.NET Core, но не могу понять, как правильно реализовать IHostedService. У меня есть несколько «рабочих» классов, которые необходимо запускать как фоновые процессы, поэтому я использую IHostedService для асинхронного запуска всех задач.
Startup.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 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();
}
}
Worker.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 и обработку ошибок, но это не так актуально)

Подробнее здесь: https://stackoverflow.com/questions/681 ... tedservice
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»