關於C#調用Excel的資源佔用問題

來源:互聯網
上載者:User

看了農民伯伯的《C# 操作Excel之旁門左道 [ C# | Excel ]》以後,無意中想起2年前做的一個小項目,自己也遇到過Excel的進程無法結束掉的這種怪問題,最終還是解決了,其實解決的原理很簡單,Excel是一個很特殊的東西,所有對它的操作都是獨佔的,因此就有必要在資源釋放上嚴格進行。為了更好的跟大家交流,也同時協助那些正在被困惑的程式員朋友們,下面就附上我以前的一段小代碼,為了能夠更快更容易說明問題,代碼經過了刪減,只儲存了結構的完整性,但不保證能夠順利編譯通過,代碼如下:

需要引用的命名空間

using Execl = Microsoft.Office.Interop.Excel;

Code
try
            {
                Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(lujing2, System.Type.Missing, false, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
                excel.Visible = true;
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1);
                //開始執行Excel操作

                if (excel.ActiveWorkbook.Saved == false)
                {
                    excel.ActiveWorkbook.Save();
                }
                excel.Quit();
                excel = null;
                Application.Exit();
                GC.Collect(System.GC.GetGeneration(worksheet));
                GC.Collect(System.GC.GetGeneration(workbook));
                GC.Collect(System.GC.GetGeneration(excel));
            }
            catch
            {

            }
            finally
            {
                GC.Collect();
            }

 

 同時,這裡有一個比較有爭議的問題,我特此聲明下:微軟強烈建議不要通過GC.Collect方法來強制執行垃圾手機,因為那會妨礙GC本身的工作方式。只有在明確知道有大量對象停止引用時,才考慮使用GC.Collect方法來調用收集器。

微軟針對excel提供的com還是非常不錯的,還請朋友們不要錯怪於它。

關於網友的回複的補充:

Excel是否是託管資源,根本就談不上,我覺得這是不同層面的東西,關鍵是我們的程式是通過調用com來對excel進行互動的,我們的com應該不是非託管資源吧。
再舉個例子:web中常見的檔案上傳與檔案打包下載,這些檔案是託管資源還是非託管資源,其實什麼都算不上,更談不到什麼釋放與不釋放的問題了。唯專屬一點不同就是對excel的操作是獨佔的。
我們的程式調用com,com去和excel執行操作,按照正常的代碼規範,這些都是可以正常被釋放的。
使用kill掉的程式,就像excel被突然結束掉,可能會產生片段等等,嚴重的excel還會被損壞,更有甚者,excel的進程根本就kill不掉,反倒會讓你的程式產生異常,造成根本無法預料到的損失。
再比如說,com都做了些什麼工作,就像正常的使用者開啟一個excel,執行了些操作,然後把excel關閉了,我們不需要再讓第三方軟體去執行什麼記憶體的釋放工作。
不同層面的東西,不要放一塊,否則會把自己都搞的很亂。
不知道我講的夠不夠清楚,還是我本身理解的有問題,歡迎指出,我們一起探討。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.