Память не освобождена в 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 освободит память. Но память продолжает использоваться, и в итоге я получаю исключение из памяти.
Я что-то упускаю или делаю что-то не так? Мне сложно опубликовать весь код метода создания отчетов, но при необходимости я постараюсь опубликовать некоторые из них.