Как запускать и останавливать задачи в 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как ввести ссылку на конкретный IhostedService в другой (зависимый) iHostedService?
    Anonymous » » в форуме C#
    0 Ответы
    0 Просмотры
    Последнее сообщение Anonymous
  • Как не запускать и не останавливать поток Oracle 23 JDBC Driver Diagnostic.CLOCK?
    Anonymous » » в форуме JAVA
    0 Ответы
    56 Просмотры
    Последнее сообщение Anonymous
  • Как программно запускать и останавливать анимацию лотереи в .NET Maui
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Диспетчер IHostedService C# .net6
    Гость » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Гость
  • Реализация IHostedService с динамическим параметром
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

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