Невозможно старательно закрыть процесс Excel, работающий в памяти - PullRequest
0 голосов
/ 21 апреля 2010

Я разработал код VB.Net для извлечения данных из файла Excel. Я загружаю эти данные в одну форму и обновляю их обратно в Excel после внесения необходимых изменений в данные.Этот полный поток работает отлично, но в большинстве случаев я наблюдал это, даже если я закрываю форму;уже загруженный процесс Excel не закрывается должным образом.

Я пытался всеми возможными способами закрыть его, но не смог решить проблему.Найдите ниже код, который я использую для подключения к Excel, и дайте мне знать, если какой-либо другой подход мне может понадобиться, чтобы решить эту проблему.

Примечание: я не хочу завершать процесс Excel, так как он будет убиватьдругие экземпляры Excel

Dim connectionString As String

connectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Источник данных =" & ExcelFilePath & "; Расширенные свойства = excel 8.0; PersistSecurity Info = False "

    excelSheetConnection = New ADODB.Connection

    If excelSheetConnection.State = 1 Then excelSheetConnection.Close()
    excelSheetConnection.Open(connectionString)
    objRsExcelSheet = New ADODB.Recordset

    If objRsExcelSheet.State = 1 Then objRsExcelSheet.Close()
    Try
        If TestID = "" Then
            objRsExcelSheet.Open("Select * from [" & ActiveSheet & "$]", excelSheetConnection, 1, 1)
        Else
            objRsExcelSheet.Open("Select Test_ID,Test_Description,Expected_Result,Type,UI_Element,Action,Data,Risk from [" & ActiveSheet & "$] WHERE TEST_Id LIKE '" & TestID & ".%'", excelSheetConnection, 1, 1)
        End If
        getExcelData = objRsExcelSheet
    Catch errObj As System.Runtime.InteropServices.COMException
        MsgBox(errObj.Message, , errObj.Source)
        Return Nothing
    End Try

    excelSheetConnection = Nothing
    objRsExcelSheet = Nothing

1 Ответ

0 голосов
/ 21 апреля 2010

Вы используете старые COM-интерфейсы VB6.В вашем фрагменте кода нет никаких доказательств того, что вы когда-либо вызывали Close () в RecordSet.Вы не можете вызывать Close () для Connection, так как для него установлено значение Nothing.

Как написано, Excel не завершит работу, пока не будет запущен сборщик мусора и поток финализатора не выпустит счетчик ссылок на интерфейсах COM.Что может занять много времени, если ваша программа не завершает работу или перестает работать после обработки данных.Вы действительно должны рассмотреть возможность поднятия этого кода, чтобы использовать классы в System.Data.Oledb, чтобы вы могли правильно утилизировать все, когда вы закончите с объектами.

Решение Q & D состоит в том, чтобы заставить поток финализатораrun:

    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()

Запустите это после того, как вы закончите использовать RecordSet.Иначе не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...