从Excel读取数据导致内存泄漏

时间:2016-10-18 14:13:54

标签: c# excel

我的代码(成功)从多个工作表中读取,生成多个列表,并将它们全部放在字典中供其他线程使用。 createLists()函数每分钟循环一次,以检查excel工作簿中的任何新数据并更新列表。

如果我在没有此功能的情况下运行我的代码,我看到没有内存泄漏。但是如果我包含这个函数,我很容易看到每次循环(每分钟)时内存都会被吃掉。

这是我的功能:

    public static void createLists()
    {

        list_dictionary.Add(1, example_list1);                  
        list_dictionary.Add(2, example_list2);
        list_dictionary.Add(3, example_list3);
        list_dictionary.Add(4, example_list4);
        list_dictionary.Add(5, example_list5);
        list_dictionary.Add(6, example_list6);

        while (true)
        {
            try
            {
                Console.WriteLine("In create");
                excel = new Excel.Application();
                excel_workbook = excel.Workbooks.Open(@"C:\Local Code\Excel\Book1.xlsx");


                for (int s = 1; s <= 6; s++)
                {
                    Excel._Worksheet excel_worksheet = excel_workbook.Sheets[s];
                    Excel.Range excel_range = excel_worksheet.UsedRange;
                    list_dictionary[s].Clear();

                    int row_count = excel_range.Rows.Count;
                    int col_count = excel_range.Columns.Count;

                    for (int x = 1; x <= row_count; x++)
                    {
                        for (int y = 1; y <= col_count; y++)
                        {
                            if (excel_range.Cells[x, y] != null && excel_range.Cells[x, y].Value2 != null)
                            {
                                list_dictionary[s].Add(excel_range.Cells[x, y].Value2.ToString());
                            }
                        }
                    }

                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    Marshal.ReleaseComObject(excel_range);
                    Marshal.ReleaseComObject(excel_worksheet);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("MANTIS");
                Console.WriteLine(e);
                Console.WriteLine(e.StackTrace);
            }
            finally
            {
                Console.WriteLine("CLEAN UP");
                GC.Collect();
                GC.WaitForPendingFinalizers();
                Marshal.ReleaseComObject(excel_workbook);
                Marshal.ReleaseComObject(excel);


            }              
            Console.WriteLine("Out create");

            Thread.Sleep(10000);
        }
    }
}

有6张&#34;张&#34;在工作簿中,因为我有一个for循环来迭代它们并更新list_dictionary中的相应列表。我ReleaseComObjectExcel.Range每个循环Excel._Worksheet,然后是while循环结束时的整个Excel.WorkbooksExcel.Application

知道我没有释放内存吗?

0 个答案:

没有答案