`

Excel在.Net 环境下Web方式下驻留内存问题的解决

阅读更多

这段时间在VS 2003 WebForm 方式下对Excel 进行操作,遇到一个最为头疼的问题就是对Excel操作完毕后Excel不能够正常关闭,系统退出后,Excel总是驻留在内存中。但是这段代码放到WinForm的程序中又没有问题。在网上进行了查找也没有找到有效可行的办法。经过无数次的尝试,终于解决如下:

原来书写如下:

private Excel.Application m_app;

private Excel.Workbook m_workbook;

this.m_app = new Excel.ApplicationClass();

this.m_app.DisplayAlerts = false;

this.m_workbook = this.m_app.Workbooks.Open(sFilePath, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value,

            Missing.Value );

修改后如下:

private Excel.Application m_app;

private Excel.Workbooks m_workbooks;

private Excel.Workbook m_workbook;

this.m_app = new Excel.ApplicationClass();

this.m_app.DisplayAlerts = false;

m_workbooks = this.m_app.Workbooks;

this.m_workbook = this.m_workbooks.Open(sFilePath, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value,

            Missing.Value );

 

同样对Sheet的操作如下

修改前如下:

Excel._Worksheet worksheet1 = null;

worksheet1 = (Excel._Worksheet) this.m_workbook.Worksheets.get_Item(sSheetName);

修改后如下:

Excel.Sheets sheets = null ;

Excel._Worksheet worksheet1 = null;

sheets = this.m_workbook.Worksheets;

worksheet1 = (Excel._Worksheet) sheets.get_Item(sSheetName);

发现区别了么?原来WorkbooksWorksheets这两个类没有被实例化就直接使用了,造成该类不能够被回收。最终造成Excel在内存的驻留。

最终以如下方式释放。

private void ReleaseAllRef(Object obj)

{

try

              {

              if (obj != null )

                            {

                                          while (Marshal.ReleaseComObject(obj) > 1);

                            }

              }

              finally

              {

                            obj = null;

              }

}

private void Release()

{

              if (m_app != null )

              {

                            m_app.Quit() ;

              }

              ReleaseAllRef(m_workbook) ; 

              m_workbook = null ; 

              ReleaseAllRef(m_workbooks) ; 

              m_workbooks = null ; 

              ReleaseAllRef(m_app) ; 

              m_app = null ; 

              System.GC.Collect() ;

}
 
分享到:
评论

相关推荐

    Excel在.Net下驻留内存的解决方法

    总结来说,解决Excel在.NET环境下内存驻留的问题,主要步骤包括: 1. 明确实例化`Workbooks`和`Worksheets`对象,避免直接通过应用程序对象访问。 2. 使用完Excel对象后,确保正确调用`Quit`方法关闭Excel应用。 3....

    内存驻留程序(C#版)

    内存驻留程序是一种特殊类型的计算机程序,它在操作系统启动后加载到内存中,并持续存在,直到系统关闭。这种程序的设计目的是为了提供实时的服务或者在后台执行特定任务,而不需要用户频繁地启动或关闭它们。本项目...

    显示内存驻留程序的信息

    内存驻留程序,通常指的是那些在计算机启动后常驻内存,持续运行并提供特定功能的程序。这些程序在操作系统启动时加载,以便快速响应用户的请求,或者为了保持系统的某些核心服务持续可用。在Windows系统中,这类...

    用汇编编写DOS下的内存驻留程序.rar

    在实践中,还需要注意一些额外的细节,比如处理程序之间的冲突、优化内存占用、以及在DOS环境下进行I/O操作的技巧。文件"用汇编编写DOS下的内存驻留程序.doc"可能会提供更具体的技术实现和示例代码,这对于深入理解...

    .NET再谈String

    在实际编程中,应根据具体情况选择合适的字符串操作方式,如使用`String.Compare()`进行比较,或者利用字符串驻留机制减少内存开销。同时,理解`string`和`System.String`的差异,可以更好地进行跨语言交互和代码的...

    一个关于内存驻留的汇编源代码

    内存驻留技术是一种在计算机操作系统中管理程序的方式,使得程序可以在需要时被快速激活,而无需反复加载到内存。在早期的个人计算机系统中,这种技术尤其重要,因为当时的内存资源相对有限。以下是对给定文件中可能...

    c#CEXCEL关闭(解决无法关闭进程的问题)

    如果不正确地关闭这个实例,进程将继续驻留在内存中,即使你的C#代码已经执行完毕。 要解决这个问题,我们需要确保在完成所有操作后,正确地释放Excel对象并结束相关进程。以下是一些关键步骤: 1. **使用using...

    你必须知道的.net(博客园整理)

    这对于开发者来说,不仅是一次技术的提升,更是思维方式的训练,有助于形成良好的编程习惯和问题解决策略。 最后一回“字符串驻留(上)---带着问题思考”深入讲解了.NET中的字符串管理机制。字符串驻留是一种优化...

    ASP.NET应用下基于SessionState的状态编程框架解决方案.docx

    ### ASP.NET应用下基于SessionState的状态编程框架解决方案 #### 一、单纯基于SessionState编程的局限性 在ASP.NET开发中,SessionState是一项常用的技术,用于保存与客户端相关的状态信息。然而,仅依赖Session...

    MFC内存驻留的实现

    内存驻留技术是一种计算机编程策略,它允许程序在操作系统启动后持续存在,即使用户关闭了应用程序,该程序的部分或全部仍然保留在系统内存中。在Windows环境中,这通常通过创建一个服务或者常驻进程来实现。MFC...

    用汇编编写DOS下的内存驻留程序.doc

    ### 汇编语言下DOS内存驻留程序设计概览 #### 1. 内存驻留程序(TSR)概念解析 内存驻留程序,全称“Terminate and Stay Resident Program”(TSR),是一种在计算机系统中加载至内存、执行完毕后并不释放其占用的内存...

    .NET技术在构建质量管理信息化系统中的运用

    .NET平台不仅为开发人员提供了便捷的方式来开发和部署运行在Internet Web服务器上的Web Service应用程序,还使得创建稳定、可靠的Windows Forms桌面应用程序变得更加容易。借助.NET平台提供的快速开发特性和丰富的...

    TC 开发内存驻留程序

    标题 "TC 开发内存驻留程序" 指的是在Turbo C (TC) 编程环境下开发一种特殊类型的程序,这种程序能够在计算机内存中常驻,即使在用户关闭程序后,它仍然保留在内存中,等待后续调用或者执行特定任务。这种技术常见于...

    linux环境下几种内存调度算法模拟.doc

    在本文中,我们将讨论 Linux 环境下的内存调度算法模拟,包括 FIFO、LRU 和 OPT 等常见内存调度算法的原理和实现方式。通过模拟实现其中任意两种调度算法,并采用这两种调度算法,对同一访问序列进行命中率计算和...

    servlet内存驻留验证

    【标题】"Servlet内存驻留验证"涉及到的是Java Web开发中的一个重要概念——Servlet生命周期与内存管理。Servlet是在服务器端运行的Java程序,用于处理客户端(如浏览器)的请求。当Servlet被加载到服务器中时,它会...

    电脑内存九大常见的问题和解决办法

    解决方法是尽量在纯DOS环境下运行这些软件。如果问题持续存在,可以尝试清理内存中的非法插件、减少活动窗口数量或调整配置文件。 7. Windows运行速度变慢、内存出错提示问题及解决方法 Windows运行速度慢和内存...

    ADO.NET本质论.pdf

    讲解了数据结构,演示了如何用ado.net来解决具体的数据访问问题。重点讨论了ado.net如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问api(包括ole db,ado...

Global site tag (gtag.js) - Google Analytics