近日執行一段陳舊的代碼,一個Batch執行EXE,每日無限循環。
唯一可以停掉該Batch的方法,就是直接將進程殺掉,或者在Batch的CMD窗口關掉X按鈕。
而后,進程中永遠都會增加一個Excel的執行進程。 必須手動關閉。
想來十分愚蠢,但細讀元代碼后,發現在處理中有Try Catch Finally 的語句。但其Finally中
原本希望的執行的,關掉Excel進程的部分,並沒有正常執行。
細讀http://thedailywtf.com/articles/My-Tales后。
歸結為:
在采取殺死進程(包括點擊X按鈕,Application.Exit()), 關電源, 以及系統內存泄漏等異常情況下, Finally 中
的語句不會被執行。只有正常的異常,比如文件不存在,數據庫斷連接等系統可預測級別的異常,才會進入Finally
因此,考慮Finally的執行語句時, 需要慎重考慮。
但是也有例外:例如Office的Excel 進程,一旦打開,普通的方法全部無效。
包括用資源回收,MarshelRelease(obj) ,Quit(), 等等統統無效。最后采用殺死進程結局。
簡例余下:
pasting
Private Function useSomeExcel(ByVal Excelfilename As String) Dim objExcel As Excel.Application Dim objWorkBook As Excel.Workbook Dim objWorkSheets As Excel.Worksheet Dim datestart As Date = Date.Now objExcel = CreateObject("Excel.Application") 'This opens... objWorkBook = objExcel.Workbooks.Open(Excelfilename) ' ... excel process Dim dateEnd As Date = Date.Now End_Excel_App(datestart, dateEnd) ' This closes excel proces End Function
pasting
Private Sub End_Excel_App(datestart As Date, dateEnd As Date) Dim xlp() As Process = Process.GetProcessesByName("EXCEL") For Each Process As Process In xlp If Process.StartTime >= datestart And Process.StartTime <= dateEnd Then Process.Kill() Exit For End If Next End Sub
Excel 使用方法:
http://qiita.com/midori44/items/acab9106e6dad9653e73