В основном оно настраивает параметры Serilog, загружает библиотеки DLL бизнес-логики, реализованные в IJob, создает источник токенов и затем запускает среду хоста:
Код: Выделить всё
class Program
{
const string DllFolderName = "SchDlls";
private static ISchedulerService _schedulerService { get; set; }
private static CancellationTokenSource _tokenSource { get; set; }
static async Task Main(string[] args)
{
SetSerilogConfiguration();
Logger.Info("Scheduler Service Started!!", "Program.Main()");
LoadAllAssemblies();
_tokenSource = new();
await Microsoft.Extensions.Hosting.Host
.CreateDefaultBuilder(args)
.UseWindowsService(options =>
options.ServiceName = "Test")
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton();
services.AddHostedService();
}).Build().RunAsync(_tokenSource.Token);
}
}
Код: Выделить всё
public interface ISchedulerService
{
Task Init(CancellationToken cancellationToken);
Task Start(CancellationToken cancellationToken);
Task Stop(CancellationToken cancellationToken);
}
Код: Выделить всё
public sealed class QuartzScheduler : ISchedulerService
{
IScheduler _scheduler = null;
private static async Task GetScheduler(CancellationToken cancellationToken)
=> await GetSchedulerFactory().GetScheduler(cancellationToken);
private static StdSchedulerFactory GetSchedulerFactory() => new();
public async Task Init(CancellationToken cancellationToken)
{
_scheduler ??= await GetScheduler(cancellationToken).ConfigureAwait(true);
}
public async Task Start(CancellationToken cancellationToken)
{
if (_scheduler is not null && !_scheduler.IsStarted)
await _scheduler.Start(cancellationToken).ConfigureAwait(true);
}
public async Task Stop(CancellationToken cancellationToken)
{
if (_scheduler is not null && !_scheduler.IsShutdown)
{
await _scheduler.Shutdown(true, cancellationToken).ConfigureAwait(true);
_scheduler = null;
}
}
}
Код: Выделить всё
public class QuartzWorker(ISchedulerService schedulerService) : IHostedService
{
public async Task StartAsync(CancellationToken cancellationToken)
{
await schedulerService.Init(cancellationToken);
await schedulerService.Start(cancellationToken);
}
public async Task StopAsync(CancellationToken cancellationToken)
{
await schedulerService.Stop(cancellationToken);
}
}

Когда я запускаю программу на 1-2 часа, она увеличивает использование оперативной памяти на 3-4 ГБ.
Это ужасно для нас:
Я учту ваши советы или причины и исправлю ситуацию.
Спасибо за ответы.
Я протестировал ASP.NET Core API на предмет утечки токена отмены и асинхронных операций. Но API ASP.NET Core прекрасно работает с менеджером.
Но консольное приложение для использования операций кварца работает не идеально.
Дайте мне знать.
Дайте мне знать.
п>
Подробнее здесь: https://stackoverflow.com/questions/788 ... mb-minutes