Как реализовать параллельные длительные фоновые задачи в. NET Core 3? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть. NET Ядро консоль приложение, содержащее две независимые задачи, которые должны выполняться параллельно в течение всего срока службы приложения. Я думал использовать BackgroundService :

class BackgroundTaskOne : BackgroundService
{
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                // do long running task for the entire life-time of application
                while(true)
                {
                    // do work one
                }
            }
            catch (Exception e)
            {
                // log
            }
        }

        return Task.CompletedTask;
    }
}

class BackgroundTaskTwo : BackgroundService
{
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                // do long running task for the entire life-time of application
                while(true)
                {
                    // do work two
                }
            }
            catch (Exception e)
            {
                // log
            }
        }

        return Task.CompletedTask;
    }
}

И зарегистрировать их так:

services.AddHostedService<BackgroundTaskOne>();
services.AddHostedService<BackgroundTaskTwo>();

Но они будут запускаться в порядке . Итак, у меня есть два вопроса:

  1. Есть ли способ заставить эти два работать параллельно?
  2. Существуют ли другие альтернативы для запуска двух длительных фоновых процессов в. NET Ядро параллельно?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Как сказано в документации: https://github.com/dotnet/AspNetCore.Docs/blob/master/aspnetcore/fundamentals/host/hosted-services.md

Дополнительные службы не запускаются до тех пор, пока ExecuteAsyn c не станет асинхронным, например, путем вызова await.

Пока у вас нет условия async, упомянутого в методе ExecuteAsync выше, я подозреваю, что ваш метод в целом синхронный. Вот почему две службы вызываются последовательно, а не параллельно. Дайте им перерыв, введите большое количество ожидаемого кода.

1 голос
/ 21 апреля 2020

Документы BackgroundService.ExecuteAsync скажем

Реализация должна возвращать задачу, которая представляет время жизни выполняемых длительных операций.

Ваша реализация возвращает выполненное задание, когда вся работа выполнена. Фактически вы реализовали его для запуска syn c, а не asyn c, и это является причиной не параллельной работы.

Вот пример реализации с некоторой фальшивой асин c work:

class BackgroundTaskOne : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                // do work one
                await Task.Delay( 100 );
            }
            catch (Exception e)
            {
                // log
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...