WEB开发网
开发学院软件开发C语言 关于C#调用Excel的资源占用问题 阅读

关于C#调用Excel的资源占用问题

 2009-05-26 08:29:09 来源:WEB开发网   
核心提示:看了农民伯伯的C# 操作Excel之旁门左道 [ C# | Excel ]以后,无意中想起2年前做的一个小项目,关于C#调用Excel的资源占用问题,自己也遇到过Excel的进程无法结束掉的这种怪问题,最终还是解决了,还是我本身理解的有问题,欢迎指出,其实解决的原理很简单,Excel是一个很特殊的东西

看了农民伯伯的C# 操作Excel之旁门左道 [ C# | Excel ]以后,无意中想起2年前做的一个小项目,自己也遇到过Excel的进程无法结束掉的这种怪问题,最终还是解决了,其实解决的原理很简单,Excel是一个很特殊的东西,所有对它的操作都是独占的,因此就有必要在资源释放上严格进行。为了更好的跟大家交流,也同时帮助那些正在被困惑的程序员朋友们,下面就附上我以前的一段小代码,为了能够更快更容易说明问题,代码经过了删减,只保存了结构的完整性,但不保证能够顺利编译通过,代码如下:

需要引用的命名空间

using Execl = Microsoft.Office.Interop.Excel;

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中常见的文件上传与文件打包下载,这些文件是托管资源还是非托管资源,其实什么都算不上,更谈不到什么释放与不释放的问题了。

我们的程序调用com,com去和excel执行操作,按照正常的代码规范,这些都是可以正常被释放的。

使用kill掉的程序,就像excel被突然结束掉,可能会产生碎片等等,严重的excel还会被损坏,更有甚者,excel的进程根本就kill不掉,反倒会让你的程序产生异常,造成根本无法预料到的损失。

再比如说,com都做了些什么工作,就像正常的用户打开一个excel,执行了些操作,然后把excel关闭了,我们不需要再让第三方软件去执行什么内存的释放工作。

不同层面的东西,不要放一块,否则会把自己都搞的很乱。

不知道我讲的够不够清楚,还是我本身理解的有问题,欢迎指出,我们一起探讨。

出处:http://wlb.cnblogs.com/

Tags:关于 调用 Excel

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接