Объекты Excel иногда не удаляются - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть этот кусок кода для чтения из ячейки Excel:

 public T GetValue<T>(string testsheet, string range)
    {
        Application excelApplication    = null;
        Workbooks workBooks             = null;
        Workbook activeWorkBook         = null;
        Worksheet activeWorkSheet       = null;

        try
        {
            excelApplication    = new Application();
            workBooks           = excelApplication.Workbooks;
            activeWorkBook      = workBooks.Open(workBook);

            activeWorkSheet     = activeWorkBook.ActiveSheet;
            var cells           = activeWorkSheet.get_Range(range);
            return cells.Value2;

        }
        catch (Exception theError)
        {
            Console.WriteLine(theError.Message);
            throw theError;
        }
        finally
        {         
            ReleaseComObject(activeWorkSheet);
            ReleaseComObject(activeWorkBook);
            ReleaseComObject(workBooks);
            ReleaseComObject(excelApplication);
        }            
    }

Также у меня есть метод Set value, который устанавливает значение для ячейки, как показано ниже:

public void SetValue<T>(string testsheet, string range, T value)
    {
        Application excelApplication = null;
        Workbooks workBooks = null;
        Workbook activeWorkBook = null;
        Worksheet activeWorkSheet = null;

        try
        {
            excelApplication = new Application();
            workBooks = excelApplication.Workbooks;
            activeWorkBook = workBooks.Open(workBook);

            activeWorkSheet = activeWorkBook.ActiveSheet;
            var cells = activeWorkSheet.get_Range(range);
            cells.Value2 = value;
            activeWorkBook.Save();             
        }
        catch (Exception theError)
        {
            Console.WriteLine(theError.Message);
            throw theError;
        }
        finally
        {
            if (activeWorkBook != null)
                activeWorkBook.Close();

            ReleaseComObject(excelApplication);
            ReleaseComObject(workBooks);
            ReleaseComObject(activeWorkBook);
            ReleaseComObject(activeWorkSheet);                                                
        }           
    }

Вот мой ReleaseComObject:

  private static void ReleaseComObject<T>(T comObject) where T : class
    {
        if (comObject != null)
            Marshal.ReleaseComObject(comObject);
    }

Я написал тест, чтобы убедиться, что объекты Excel правильно расположены, как показано ниже:

  [Test]
    public void Should_dispose_excel_objects_created_after_io_operation()
    {
        var expected = Process.GetProcesses().Count(process => process.ProcessName.ToLower() == "excel");

        var automationClient = new ExcelAutomation.ExcelAutomationClient(ExcelSheet);

        automationClient.SetValue("Sheet1", "A1", 1200);
        automationClient.GetValue<double>("Sheet1", "A1");

        var actual = Process.GetProcesses().Count(process => process.ProcessName.ToLower() == "excel");

        actual.Should().Be(expected, "Excel workbook is not disposed properly. There are still excel processess in memory");
    }

Этот тест проходит, если я вызываю толькоМетод SetValue, однако при вызове GetValue происходит сбой.Однако я не вижу Excel.exe в диспетчере задач.Любая идея, почему это происходит, пожалуйста?Что-то не так с моей функцией GetValue?

1 Ответ

0 голосов
/ 25 февраля 2012

Когда вы закончили утилизацию объекта, используйте

GC.Collect();

Вот так я избавляюсь от объекта Excel

        private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...