我一直在尋找這個問題,但我似乎無法找到一個完全符合我的問題的問題。
我正在創建一個新的 excel 檔案,用資料填充它,并將其顯示給用戶。在監視任務管理器時,我可以看到,一旦為用戶創建并打開檔案,后臺行程就會按預期消失。(主行程仍然在頂部運行,因為檔案是打開的。)
我遇到的問題是,一旦用戶關閉檔案,Excel 后臺行程就會在串列中彈出,并且在程式(生成檔案的)關閉之前不會消失。
這是我正在使用的清理;
Dim xlObject As New Excel.Application
Dim xlBook As Excel.Workbook = Nothing
Dim xlSheet As Excel.Worksheet = Nothing
xlBook = xlObject.Workbooks.Add
xlSheet = xlBook.Worksheets(1)
'Fill data and do some formatting
xlBook.SaveAs("FileName")
xlObject.Visible = True
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
xlSheet = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
xlBook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlObject)
xlObject = Nothing
有什么我想念的嗎?為什么后臺行程會繼續并且只有在創建程式關閉后才會消失?
這是使用 Visual Studios 2013、Office 365 Excel 和 Windows 10 Pro
uj5u.com熱心網友回復:
你看,在 Interop 中,你應該避免通過另一個物件訪問一個物件,比如
xlBook = xlObject.Workbooks.Add
這稱為兩點規則。原因是該Workbooks物件然后在 .NET 中被參考并被孤立(并且也應該被殺死,因為你有其他三個)
因此,請參考作業簿,然后也將其洗掉。
Dim xlApp As New Excel.Application()
Dim xlBooks = xlApp.Workbooks
Dim xlBook = xlBooks.Add
Dim xlSheet = DirectCast(xlBook.Worksheets(1), Excel.Worksheet)
Try
xlBook.SaveAs("FileName.xlsx")
xlApp.Visible = True
Finally
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
xlSheet = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
xlBook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
xlBooks = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
End Try
而且,我總是為此而掙扎,因為根據 StackOverflow 上 vb.net 的杰出專家 HansPassant 的說法,兩點規則只是迷信,正如他所說:“請繼續忽略 [兩點規則],它是胡說八道,只會引起悲傷”,但就您的問題而言,我只能通過遵循兩點規則來使其作業,而不是使用 Hans 的解決方案:
GC.Collect()
GC.WaitForPendingFinalizers()
也許漢斯會看到這一點,讓我們直截了當!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/384930.html
標籤:擅长 网络 视觉工作室-2013 背景 后台进程
