我的代码(成功)从多个工作表中读取,生成多个列表,并将它们全部放在字典中供其他线程使用。 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
中的相应列表。我ReleaseComObject
和Excel.Range
每个循环Excel._Worksheet
,然后是while循环结束时的整个Excel.Workbooks
和Excel.Application
。
知道我没有释放内存吗?