Утечка памяти при экспорте Excel с использованием объекта ReportDocument - PullRequest
0 голосов
/ 19 июня 2020

У меня есть оконная служба, в которой есть таймер, а таймер установлен на 1 минуту. Эта услуга работает 24 * 7 непрерывно, что дает прибл. 500-600 отчетов ежедневно. Он работает нормально, за исключением утечки памяти при генерации excel каждый раз. Ежедневно, что наблюдаю, память увеличивается на 100 МБ. Я удаляю объект reportdocument, но каким-то образом он не очищает память в полной мере. Пожалуйста, не могли бы кто-нибудь помочь в этом?

Ниже приведен метод, который используется для экспорта в Excel.

        public static void GenerateExcel(string reportName, DataTable dtData, string fileName)
        {
            ExportOptions exportOpts = null;
            ExcelFormatOptions excelFormatOpts = null;
            DiskFileDestinationOptions diskOpts = null;
            ReportDocument reportDocument = null;
            try
            {
                // Creating ReportViewer Object
                reportDocument = new ReportDocument();
                exportOpts = new ExportOptions();
                excelFormatOpts = new ExcelFormatOptions();
                diskOpts = new DiskFileDestinationOptions();
                reportDocument.FileName = reportName;
                reportDocument.SetDataSource(dtData);
                exportOpts = reportDocument.ExportOptions;
                excelFormatOpts.ExcelUseConstantColumnWidth = true;
                excelFormatOpts.ExcelTabHasColumnHeadings = true;
                exportOpts.ExportFormatType = ExportFormatType.ExcelRecord;
                exportOpts.FormatOptions = excelFormatOpts;
                exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;
                diskOpts.DiskFileName = fileName;
                exportOpts.DestinationOptions = diskOpts;
                reportDocument.Export();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (reportDocument != null)
                {
                    reportDocument.Close();
                    reportDocument.Dispose();
                    reportDocument = null;
                    exportOpts = null;
                    excelFormatOpts = null;
                    diskOpts = null;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
        }
...