Планирование фоновых задач в .NET CORE - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу создать динамическое задание cron (фоновые задачи не должны затрагиваться, если сервер приложений выходит из строя), основываясь на каждом запросе, и задание cron можно перенести или удалить. Что является лучшим способом реализовать его в ядре .net.

1 Ответ

0 голосов
/ 03 декабря 2018

Создайте новое консольное приложение ядра .net и используйте шаблон ниже

в вашем Program.cs внутри основного метода (уровень C # равен 7):

public static async Task Main(string[] args)
{  
    var builder = new HostBuilder()
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
        // i needed the input argument for command line, you can use it or simply remove this block
            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }

            Shared.Configuration = config.Build();
        })
        .ConfigureServices((hostContext, services) =>
        {
            // dependency injection

            services.AddOptions();
           // here is the core, where you inject the
           services.AddSingleton<Daemon>();
           services.AddSingleton<IHostedService, MyService>();
        })
        .ConfigureLogging((hostingContext, logging) => {
           // console logging 
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
        });

    await builder.RunConsoleAsync();
}

здесьэто код демона / сервиса

public class MyService: IHostedService, IDisposable
   {
       private readonly ILogger _logger;
       private readonly Daemon _deamon;

       public MyService(ILogger<MyService> logger, Daemon daemon /* and probably the rest of dependencies*/)
       {
           _logger = logger;         
           _daemon = daemon;  
       }

       public async Task StartAsync(CancellationToken cancellationToken)
       {
           await _deamon.StartAsync(cancellationToken);
       }

       public async Task StopAsync(CancellationToken cancellationToken)
       {
           await _deamon.StopAsync(cancellationToken);
       }

       public void Dispose()
       {
           _deamon.Dispose();
       }
}

, и вот ядро, что вы хотите сделать, приведенный ниже код является шаблоном , и вы должны предоставить правильную реализацию :

public class Daemon: IDisposable
   {
       private ILogger<Daemon> _logger;


       protected TaskRunnerBase(ILogger<Daemon> logger)
       {
          _logger = logger;
       }

       public async Task StartAsync(CancellationToken cancellationToken)
       {            
           while (!cancellationToken.IsCancellationRequested)
           {
                await MainAction.DoAsync(cancellationToken); // main job 
            }
       }

       public async Task StopAsync(CancellationToken cancellationToken)
       {
           await Task.WhenAny(MainAction, Task.Delay(-1, cancellationToken));
           cancellationToken.ThrowIfCancellationRequested();
       }

       public void Dispose()
       {
            MainAction.Dispose();
       }
}
  1. ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ОБА * WINDOWS И LINUX ПОТОМУ ЧТО ВЫ ИСПОЛЬЗУЕТЕ .NET CORE
  2. MY .NET CORE VERSION = 2.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...