Память не освобождена в TPL

Я работаю над службой Windows генерации отчетов, которая в основном будет извлекать данные из БД, создавать излишки в памяти, а затем сохранит эти показатели как byte[] в БД. Чтобы ускорить процесс, я решил использовать TPL, и ниже приведен код, который я написал.

    List<ReportData> lstRd = new List<ReportData>();
    List<Task> tasks = new List<Task>;
    foreach (var item in lstRd)
    {
        tasks.Add(Task.Factory.StartNew(GenerateReport()));
    }

    Task.WaitAll(tasks.ToArray());

    tasks.ForEach(x=>
    if(!x.IsCompleted) 
    x.Wait());

    Task.Factory.ContinueWhenAll(tasks.ToArray(),StopService());

GenerateReport() метод получит данные из БД для каждого отчета, создаст Excel и сохранит byte[] в дБ Так что в основном это занимает много времени и требует много памяти.

Эта проблема

Моя проблема в том, что всякий раз, когда я вижу диспетчер задач на сервере, процесс никогда не освобождает используемую память. Иногда, когда одна задача завершается (я предполагаю, что она завершается, когда флаг обновляется как обработанный в БД), а другая ожидает получения данных из БД, память, используемая в диспетчере задач, остается той же самой, а вторая задача начинает обрабатывать используемая память продолжает расти.

Я ожидал, что TPL будет автоматически Dispose() после того, как задача будет выполнена, GC освободит память. Но память продолжает использоваться, и в итоге я получаю исключение из памяти.

Я что-то упускаю или делаю что-то не так? Мне сложно опубликовать весь код метода создания отчетов, но при необходимости я постараюсь опубликовать некоторые из них.

0 ответов

Другие вопросы по тегам