Утечки памяти CancellationTokenSource+CallBackNode (10 МБ/мин)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Утечки памяти CancellationTokenSource+CallBackNode (10 МБ/мин)

Сообщение Anonymous »

У меня есть консольное приложение для операций кварца.
В основном оно настраивает параметры 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);
}
}
Я регистрирую службы. Интерфейс планировщика по сути абстрагирует операции Init, Start и Stop.

Код: Выделить всё

public interface ISchedulerService
{
Task Init(CancellationToken cancellationToken);
Task Start(CancellationToken cancellationToken);
Task Stop(CancellationToken cancellationToken);
}
Реализацией ISchedulerService является Quartz:

Код: Выделить всё

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;
}
}
}
А работник размещенной службы выполняет операции запуска и остановки для консольного приложения .net.

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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