0

I have a code that converts bunch of csv files into excel and then highlights some rows.When I feed multiple files it throws memory out of exception . I believe there are memory leaks in code pertaining to com objects.Also, I am not sure how to correctly place garbage collectors. Below is my do work method of background worker . It works fine if I put single file but for multiple file is throws exception. I just need help in assesing if i am correctly releasing memory ,or my logic is inefficient, or really i am using extra memory [I dont believe this might be case] Giving below my code for expert analysis

 try
        {

            Microsoft.Office.Interop.Excel.Application oXL;
            Microsoft.Office.Interop.Excel.Workbook oWB;
            Microsoft.Office.Interop.Excel.Worksheet oSheet;
            Microsoft.Office.Interop.Excel.Range oRng;

           

            oXL = new Microsoft.Office.Interop.Excel.Application();
            oXL.Visible = false;
            oWB = (Microsoft.Office.Interop.Excel.Workbook)(oXL.Workbooks.Add(""));
            oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oWB.ActiveSheet;

            oSheet.Name = "Summary Report";
            object misvalue = System.Reflection.Missing.Value;

            int file_progress_Delta = 72 / lstFileName.Count();
    

            int droppedCount = 0;
            int acceptedCount = 0;
            int invalidMACCount = 0;
            int ARCRepeatedCount = 0;
            int tMAC1matchedCount = 0;
            int tMACmatchedCount = 0;
            int tMAC2matchedCount = 0;
            int tMAC3matchedCount = 0;
            int syncFrameARCUpdatedCount = 0;
            int resyncFrameARCUpdatedCount = 0;
            int syncFrameARCNotUpdatedCount = 0;
            int resyncFrameARCNotUpdatedCount = 0;
            int securedinvalidframeCount = 0;
            int ARClessthanwindowCount = 0;
            int tMACNotMatchedSyncFrame = 0;
            int tMACNotMatchedReSyncFrame = 0;
            int tMACMatched = 0;
            int IPDUDLCZeroCount = 0;
            int IPDUDLCEightCount = 0;
            int invalidpaddingCount = 0;
            int invalidContainerFrame = 0;



            oSheet.Cells[2, 3] = "Log Analysis Report";
            oSheet.Cells[4, 4] = "Category";
            oSheet.Cells[4, 5] = "Count";
            oSheet.Cells[6, 4] = "Result";
            oSheet.Cells[7, 4] = "Accepted";
            oSheet.Cells[8, 4] = "Dropped";
            oSheet.Cells[10, 4] = "Remarks";
            oSheet.Cells[11, 4] = "Invalid MAC";
            oSheet.Cells[12, 4] = "ARC Repeated";
            oSheet.Cells[13, 4] = "tMAC1 matched";
            oSheet.Cells[14, 4] = "tMAC2 matched";
            oSheet.Cells[15, 4] = "tMAC3 matched";
            oSheet.Cells[16, 4] = "Sync Frame ARC Updated";
            oSheet.Cells[17, 4] = "Resync Frame ARC Updated";
            oSheet.Cells[18, 4] = "MAC matched. Sync frame ARC not updated";
            oSheet.Cells[19, 4] = "MAC matched. Resync frame ARC not updated";
            oSheet.Cells[20, 4] = "Secured invalid frame";
            oSheet.Cells[21, 4] = "ARC less than window";
            oSheet.Cells[22, 4] = "tMAC Not Matched Sync Frame";
            oSheet.Cells[23, 4] = "tMAC Not Matched ReSync Frame";
            oSheet.Cells[24, 4] = "tMAC Matched";
            oSheet.Cells[25, 4] = "Secure container frame check";
            oSheet.Cells[26, 4] = "IPDU DLC =0";
            oSheet.Cells[27, 4] = "IPDU DLC >8";
            oSheet.Cells[28, 4] = "Invalid padding";
            oSheet.Cells[29, 4] = "Invalid Container Frame";
            oSheet.Cells[30, 4] = "Sync ARC jumps greater than 1 million";

            oSheet.get_Range("E7", "E30").HorizontalAlignment =
                Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

            oSheet.get_Range("C2", "F2").HorizontalAlignment =
                Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            oSheet.get_Range("C2", "F2").Font.Bold = true;
            oSheet.get_Range("C2", "F2").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);

            oSheet.get_Range("D4", "E4").Font.Bold = true;
            oSheet.get_Range("D4", "E4").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
            oSheet.get_Range("D4", "E4").VerticalAlignment =
                Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

            oSheet.get_Range("D6", "E6").Font.Bold = true;
            oSheet.get_Range("D6", "E6").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
            oSheet.get_Range("D6", "E6").VerticalAlignment =
                Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

            oSheet.get_Range("D10", "E10").Font.Bold = true;
            oSheet.get_Range("D10", "E10").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
            oSheet.get_Range("D10", "E10").VerticalAlignment =
                Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

            oSheet.get_Range("D25", "E25").Font.Bold = true;
            oSheet.get_Range("D25", "E25").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
            oSheet.get_Range("D25", "E25").VerticalAlignment =
                Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

            oSheet.get_Range("D30", "E30").Font.Bold = true;
            oSheet.get_Range("D30", "E30").Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue);
            oSheet.get_Range("D30", "E30").VerticalAlignment =
                Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

            oRng = oSheet.get_Range("C2", "F2");
            oRng.Borders.Color = System.Drawing.Color.Black.ToArgb();
            oRng = oSheet.get_Range("D4", "D30");
            oRng.Borders.Color = System.Drawing.Color.Black.ToArgb();
            oRng = oSheet.get_Range("E4", "E30");
            oRng.Borders.Color = System.Drawing.Color.Black.ToArgb();

            oSheet.Range[oSheet.Cells[2, 3], oSheet.Cells[2, 6]].Merge();
            oRng = oSheet.get_Range("D4", "E4");
            oRng.EntireColumn.AutoFit();
            //backgroundWorker1.ReportProgress(3,0);
            backgroundWorker1.ReportProgress(5);
            percentageCounter = 5;
            fileCount = 0;

            



            foreach (String file in lstFileName)
            {
                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                Thread.Sleep(1000);
                Microsoft.Office.Interop.Excel.Application appCSVToExcel;
                Excel.Application appHighlight;
                string name = file.Split('.')[0].ToString().Split('\\').Last();
                //Converting each file from .csv to excel
                appCSVToExcel = new Microsoft.Office.Interop.Excel.Application();
                appCSVToExcel.DisplayAlerts = false;
                Microsoft.Office.Interop.Excel.Workbook wbCSVToExcel = appCSVToExcel.Workbooks.Open(file, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                wbCSVToExcel.SaveAs(outputFolderPath + "\\" + name + ".xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                wbCSVToExcel.Close();
                appCSVToExcel.Quit();

               
                //int generation_3 = System.GC.GetGeneration(appCSVToExcel);
                //System.GC.Collect(generation_3);


                Marshal.ReleaseComObject(wbCSVToExcel);
                Marshal.ReleaseComObject(appCSVToExcel);
                //appCSVToExcel =null;
                //wbCSVToExcel = null;
                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                //Thread.Sleep(2);
                //backgroundWorker1.ReportProgress(10); 
                //Highlighting the excel files
                //Application.DoEvents();
                //GC.Collect();

                appHighlight = new Excel.Application();

                var wbHighlight = appHighlight.Workbooks;
                var workbook = wbHighlight.Open(outputFolderPath + "\\" + name + ".xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
                Microsoft.Office.Interop.Excel.Range usedRange = worksheet.UsedRange;
                Microsoft.Office.Interop.Excel.Range rows = usedRange.Rows;
                Microsoft.Office.Interop.Excel.Range columns = usedRange.Columns;
                appHighlight.DisplayAlerts = false;
                r = rows.Count;
                c = columns.Count;
                var startCell = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, 1];
                var endCell = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r, 12];

                object[,] RangeValues = worksheet.get_Range(startCell, endCell).Value2;
                ArrayList higlight = new ArrayList();

                for (int i = 1; i <= r; i++)
                {

                    if (RangeValues[i, 8] != null)
                    {
                        //if (RangeValues[i, 9].ToString() == "Invalid MAC"
                        //|| RangeValues[i, 9].ToString() == "ARC Repeated"
                        //|| RangeValues[i, 9].ToString() == "Secured invalid frame"
                        //|| RangeValues[i, 9].ToString() == "ARC less than window")

                       
                        if (RangeValues[i, 8].ToString() == "Dropped")
                        {
                            higlight.Add(i);

                        }


                    }





                    //Thread.Sleep(2);
                    //backgroundWorker1.ReportProgress(20);
                    string firstCellValue1 = "";
                    if (RangeValues[i, 8] != null)
                    {
                        firstCellValue1 = RangeValues[i, 8].ToString();
                    }

                    if (firstCellValue1 == "Accepted")
                    {
                        acceptedCount++;
                    }

                    if (firstCellValue1 == "Dropped")
                    {
                        droppedCount++;
                    }

                    string cell = "";
                    if (RangeValues[i, 9] != null)
                    {
                        cell = RangeValues[i, 9].ToString();
                    }

                    switch (cell)
                    {
                        case "Invalid MAC":
                            invalidMACCount++;
                            break;
                        case "ARC Repeated":
                            ARCRepeatedCount++;
                            break;
                        case "tMAC1 matched":
                            tMAC1matchedCount++;
                            break;
                        case "tMAC2 matched":
                            tMAC2matchedCount++;
                            break;
                        case "tMAC3 matched":
                            tMAC3matchedCount++;
                            break;
                        case "Sync Frame ARC Updated":
                            syncFrameARCUpdatedCount++;
                            break;
                        case "Resync Frame ARC Updated":
                            resyncFrameARCUpdatedCount++;
                            break;
                        case "MAC matched. Sync frame ARC not updated":
                            syncFrameARCNotUpdatedCount++;
                            break;
                        case "MAC matched. Resync frame ARC not updated":
                            resyncFrameARCNotUpdatedCount++;
                            break;
                        case "ARC less than window":
                            ARClessthanwindowCount++;
                            break;
                        case "tMAC Matched":
                            tMACmatchedCount++;
                            break;
                        case "tMAC Not Matched Sync Frame":
                            tMACNotMatchedSyncFrame++;
                            break;
                        case "tMAC Not Matched ReSync Frame":
                            tMACNotMatchedReSyncFrame++;
                            break;
                        default:
                            break;
                    }

                    string cellReceptionRemarks = "";
                    if (RangeValues[i, 12] != null)
                    {
                        cellReceptionRemarks = RangeValues[i, 12].ToString();
                    }

                    switch (cellReceptionRemarks)
                    {
                        case "Zero DLC of 'contained I-PDU' has been detected.":
                            IPDUDLCZeroCount++;
                            break;
                        case "DLC greater than 8 in 'contained I-PDU' has been detected.":
                            IPDUDLCEightCount++;
                            break;
                        case "Padding other than 0x00 or 0xFF is observed in frame":
                            invalidpaddingCount++;
                            break;
                        case "Invalid container frame structure.":
                            invalidContainerFrame++;
                            break;
                    }

                    //backgroundWorker1.ReportProgress(25,0);
                    //percentageCounterFile++;

                    //int countProcessFile = r;
                    //percentFile = 100 - (((countProcessFile - percentageCounterFile) * 100) / countProcessFile);
                    //backgroundWorker1.ReportProgress(percentFile);
                }
               
                for (int k = 0; k < higlight.Count; k++)
                {
                    string exclcmnS1 = "A" + higlight[k];
                    string exclcmnL1 = "L" + higlight[k];
                    Excel.Range _range1;
                    _range1 = worksheet.get_Range(exclcmnS1, exclcmnL1);
                    _range1.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Pink);
                    _range1.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
                }





                workbook.SaveAs(outputFolderPath + "\\" + name + ".xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);


               // GC.Collect();
                //GC.WaitForPendingFinalizers();
                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                int generation = System.GC.GetGeneration(appHighlight);
                System.GC.Collect(generation);
                //int generation_4 = System.GC.GetGeneration(wbHighlight);
                //System.GC.Collect(generation_4);
                //int generation_5 = System.GC.GetGeneration(workbook);
                //System.GC.Collect(generation_4);
                //int generation_6 = System.GC.GetGeneration(worksheet);
                //System.GC.Collect(generation_4);
                //int generation_7 = System.GC.GetGeneration(usedRange);
                //System.GC.Collect(generation_4);
                //int generation_8 = System.GC.GetGeneration(rows);
                //System.GC.Collect(generation_4);
                //int generation_9 = System.GC.GetGeneration(columns);
                //System.GC.Collect(generation_4);

                wbHighlight.Close();
                //workbook.Close(0);
                appHighlight.Quit();

                //usedRange.Clear();
                //rows.Clear();
                //columns.Clear();

                while (Marshal.ReleaseComObject(appHighlight) != 0) { }
                while (Marshal.ReleaseComObject(wbHighlight) != 0) { }
                while (Marshal.ReleaseComObject(workbook) != 0) { }
                while (Marshal.ReleaseComObject(worksheet) != 0) { }
                while (Marshal.ReleaseComObject(usedRange) != 0) { }
                while (Marshal.ReleaseComObject(rows) != 0) { }
                while (Marshal.ReleaseComObject(columns) != 0) { }
                //while (Marshal.ReleaseComObject(worksheet.get_Range(startCell, endCell)) != 0) { }
                //while (Marshal.ReleaseComObject(RangeValues) != 0) { }
                //while (Marshal.ReleaseComObject(_range1) != 0) { }
                appHighlight = null;
                wbHighlight = null;
                workbook = null;
                worksheet = null;
                usedRange = null;
                rows = null;
                columns = null;
                RangeValues = null;
                //_range1 = null;
                //startCell = null;
                //endCell = null;
                //higlight = null;

                //KillSpecificExcelFileProcess(name + ".xlsx");
                //Thread.Sleep(2);
                //backgroundWorker1.ReportProgress(60,0);
                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                //var processes = from p in Process.GetProcessesByName("EXCEL") select p;
                //foreach (var process in processes)
                //{
                //    process.Kill();
                //}

                //For Abnormal ARC

                //rch_updates.AppendText(DateTime.Now.ToString("t") + "     " + "Analyzing file : "+file +" for Abnormal ARC Increments.\n");
                // Application.DoEvents();

                var excel_Report = new excel.Application();
                var excelWB = excel_Report.Workbooks.Add();
                var workSheet = excelWB.ActiveSheet;



                dict_ADAS = new Dictionary<Int64, Int64>();
                dict_BCM = new Dictionary<Int64, Int64>();
                dict_CDM = new Dictionary<Int64, Int64>();
                dict_AVM = new Dictionary<Int64, Int64>();
                dict_SONAR = new Dictionary<Int64, Int64>();
                dict_PWT = new Dictionary<Int64, Int64>();
                dict_ATCU = new Dictionary<Int64, Int64>();

                // List of class Logdata

                data = new List<LogData>();

                dict_LogData = new Dictionary<Int64, LogData>();
                List<string> lines = new List<string>();


                workSheet.Name = "Abnormal ARC Observations";
                excel_Report.Visible = false;

                workSheet.Cells[1, "A"] = "Time Stamp";
                workSheet.Cells[1, "B"] = "CAN ID";
                workSheet.Cells[1, "C"] = "DLC";
                workSheet.Cells[1, "D"] = "CAN PAYLOAD";
                workSheet.Cells[1, "E"] = "RESULT";
                workSheet.Cells[1, "F"] = "REMARK";
                workSheet.Cells[1, "G"] = "ARC Difference";

                //Thread.Sleep(2);
                //backgroundWorker1.ReportProgress(65,0);

                readCSV(file, lines);
                //backgroundWorker1.ReportProgress(70,0);
                categorizeSyncFrames();
                //backgroundWorker1.ReportProgress(75,0);
                identifyAbnormalIndices();
                //backgroundWorker1.ReportProgress(80);
                writeToReport(workSheet);

                //Thread.Sleep(2);
                //backgroundWorker1.ReportProgress(85);
                dict_LogData.Clear();
                dict_ATCU.Clear();
                dict_ADAS.Clear();
                dict_AVM.Clear();
                dict_CDM.Clear();
                dict_PWT.Clear();
                dict_SONAR.Clear();
                dict_BCM.Clear();

                ADAS_Indices_List.Clear();
                BCM_Indices_List.Clear();
                CDM_Indices_List.Clear();
                AVM_Indices_List.Clear();
                SONAR_Indices_List.Clear();
                PWT_Indices_List.Clear();
                ATCU_Indices_List.Clear();

                data.Clear();
                dict_LogData.Clear();

                


                excel_Report.DisplayAlerts = false;
                excelWB.SaveAs(outputFolderPath + "\\" + "Abnormal_ARC_Increment" + DateTime.Now.ToLongDateString() + ".xlsx", excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                int generation_2 = System.GC.GetGeneration(excel_Report);
                System.GC.Collect(generation_2);
                excelWB.Close(0);
                excel_Report.Quit();

                //rch_updates.AppendText(DateTime.Now.ToString("t") + "     " + "File Analysis complete for : " + file + " for Abnormal ARC Increments.\n");

                while (Marshal.ReleaseComObject(excel_Report) != 0) { }
                while (Marshal.ReleaseComObject(excelWB) != 0) { }
                while (Marshal.ReleaseComObject(workSheet) != 0) { }


                excel_Report = null;
                excelWB = null;
                workSheet = null;


                fileCount++;

                percentageCounter += file_progress_Delta;
                backgroundWorker1.ReportProgress(percentageCounter);
            }

           

            oSheet.Cells[7, 5] = acceptedCount;
            oSheet.Cells[8, 5] = droppedCount;
            oSheet.Cells[11, 5] = invalidMACCount;
            oSheet.Cells[12, 5] = ARCRepeatedCount;
            oSheet.Cells[13, 5] = tMAC1matchedCount;
            oSheet.Cells[14, 5] = tMAC2matchedCount;
            oSheet.Cells[15, 5] = tMAC3matchedCount;
            oSheet.Cells[16, 5] = syncFrameARCUpdatedCount;
            oSheet.Cells[17, 5] = resyncFrameARCUpdatedCount;
            oSheet.Cells[18, 5] = syncFrameARCNotUpdatedCount;
            oSheet.Cells[19, 5] = resyncFrameARCNotUpdatedCount;
            oSheet.Cells[20, 5] = securedinvalidframeCount;
            oSheet.Cells[21, 5] = ARClessthanwindowCount;
            oSheet.Cells[22, 5] = tMACNotMatchedSyncFrame;
            oSheet.Cells[23, 5] = tMACNotMatchedReSyncFrame;
            oSheet.Cells[24, 5] = tMACMatched;
            oSheet.Cells[26, 5] = IPDUDLCZeroCount;
            oSheet.Cells[27, 5] = IPDUDLCEightCount;
            oSheet.Cells[28, 5] = invalidpaddingCount;
            oSheet.Cells[29, 5] = invalidContainerFrame;

            //Abnromal ARC observations count
            oSheet.Cells[30, 5] = (i - 1) / 2;

            backgroundWorker1.ReportProgress(85);

            oXL.Visible = false;
            oXL.UserControl = false;
            oXL.ActiveWindow.DisplayGridlines = false;
            oXL.DisplayAlerts = false;
            oWB.SaveAs(outputFolderPath + "\\" + DateTime.Now.ToLongDateString() + "Report.xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);



            oWB.Close(0);
            oXL.Quit();

            backgroundWorker1.ReportProgress(90);
            //Marshal.FinalReleaseComObject(oSheet);
            //Marshal.FinalReleaseComObject(oWB);
            //Marshal.FinalReleaseComObject(oXL);
            //Marshal.FinalReleaseComObject(oRng);

            while (Marshal.ReleaseComObject(oXL) != 0) { }
            while (Marshal.ReleaseComObject(oWB) != 0) { }
            while (Marshal.ReleaseComObject(oSheet) != 0) { }
            while (Marshal.ReleaseComObject(oRng) != 0) { }

            oXL = null;
            oWB = null;
            oSheet = null;
            oRng = null;

            //KillSpecificExcelFileProcess(DateTime.Now.ToLongDateString() + "Report.xlsx");

            //Thread.Sleep(2);
            backgroundWorker1.ReportProgress(100);
            //progressBar3.Value = 100;
            e.Result = true;

        }
        catch (Exception ex)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            MessageBox.Show(ex.ToString());
            //wbHighlight.Close();
            //appHighlight.Quit();

            //int generation = System.GC.GetGeneration(appHighlight);
            //System.GC.Collect(generation);
            var processes = from p in Process.GetProcessesByName("EXCEL") select p;
            foreach (var process in processes)
            {
                process.Kill();
            }
        }

        finally
        {

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
           
            //wbHighlight.Close();
            //appHighlight.Quit();

            //int generation = System.GC.GetGeneration(appHighlight);
            //System.GC.Collect(generation);
            var processes = from p in Process.GetProcessesByName("EXCEL") select p;
            foreach (var process in processes)
            {
                process.Kill();
            }
        }
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
  • 3
    That is not a [mcve], you should consider making your example code much more simple to avoid others looking at unrelated code. That being said, this question looks very similar to this other one [Clean up Excel Interop Objects with IDisposable](https://stackoverflow.com/questions/25134024/clean-up-excel-interop-objects-with-idisposable) – Cleptus Mar 27 '20 at 07:04

1 Answers1

-1

Why do you create new Excel instance for each file ? Try to create one excel instance and just close the workbook and open a new one for each file.

It is bad practice to call GC.Collect manually (GC is quite smart to collect object instances if there is no alive dependencies).

You do not have to copy the same code from finally to catch - finally is executed always.

Why do you think that Excel causes out of memory? What about identifyAbnormalIndices, writeToReport, writeToReport methods? Seems that there are a lot of global variables, like dictionaries you are creating.

Are you using using when working with file/stream in the readCSV method?

Is there really need to store int64 in the Dictionary btw? Can you use int32 ?

Try to use VS memory dumps and check what kind of objects are being kept in the memory. Just run the program under debug and take memory dump after one file was processed. Then you can compare the dumps, check the diff and you will get some imagine what objects are not collected by the GC.

UPD link provided by @bradbury9 should be taken into account as well.

oleksa
  • 3,688
  • 1
  • 29
  • 54