博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Com Excel组件释放资源关闭进程总结
阅读量:5267 次
发布时间:2019-06-14

本文共 4449 字,大约阅读时间需要 14 分钟。

C#如何释放非托管资源

.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象。Microsoft.Office.Interop.Excel就属于一个COM对象,因此由它生成的所有资源都是非团管资源。

根据MSDN上的描述:为适当释放非托管资源,建议您实现公共的 Dispose 或 Close 方法,这两个方法可为对象执行必要的清理代码操作。 IDisposable 接口为实现接口的资源类提供 Dispose 方法。 因为 Dispose 方法是公共的,所以应用程序用户可以直接调用该方法来释放非托管资源占用的内存。使用 Dispose 方法主要在使用本机资源的托管对象和向 .NET framework 公开 COM 对象。

链接:

using语句

using的功能有:引入命名空间,为命名空间或类型创建别名。

using 语句还的一个作用是允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。

使用规则:

  a)   using语句只能用于实现了IDisposable接口的类型,禁止为不支持IDisposable接口类型使用using语句,否则会出现编译错误

b)   using语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以try-finaly来实现,因为嵌套using语句可能存在隐藏的Bug.内层using块引发异常时,将不能释放外层using块的对象资源。

 

 

using实质:

  在程序编译阶段,编译器会自动将using语句生成try-finally语句,并在finally块中调用对象的Dispose方法,来清理资源.所以,using语句等效于try-finally语句。

封装Excel操作类

综上我们可以封装一个Excel操作类,继承IDispose接口,实现Dispose方法释放Excel生成的所有非托管资源,最后由GC回收,在声明该类对象的时候用using(ExcelHelper excel=new ExcelHelper ()){  }。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Microsoft.Office.Interop.Excel; 6 using System.Runtime.InteropServices; 7  8 namespace ClassLibrary1 9 {10     public  class ExcelHelper :IDisposable11     {12         #region 变量13         private Application _application ;14         private Workbook _workbook;15         private Worksheet _worksheet;16         private Range _range;17         #endregion18 19        20         /// 21         /// 构造函数22         /// 23         public ExcelHelper()24         {25             this._application = new Application();26             this._workbook = this._application.Workbooks.Add(Type.Missing);27             this._worksheet = (Worksheet)_workbook.Sheets.get_Item(1); 28         }29         /// 30         /// 创建Excel返回路径?31         /// 32         /// 
33 public string CreateExcel(bool isSleep=true)34 {35 36 _worksheet.Cells[1, 5] = "项目质量计划";37 _range = (Range)_worksheet.get_Range("B1","L1");38 _range.Merge(0);39 _range = (Range)_worksheet.Cells[1, 5];40 _range.EntireColumn.AutoFit();41 //throw new Exception();42 string filePath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "QualityPlan\\Files";43 if (!System.IO.Directory.Exists(filePath))44 {45 System.IO.Directory.CreateDirectory(filePath);46 }47 string FullName = "质量计划导出模板" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls";48 string filefullpath = filePath + "\\" + FullName;49 _application.ActiveWorkbook.SaveAs(filefullpath, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel12, null, null, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null);50 return filefullpath;51 }52 53 /// 54 /// 释放资源,IDispose接口55 /// 56 public void Dispose()57 {58 if (_workbook != null)59 _workbook.Close(null, null, null);60 if (_application != null)61 {62 _application.Workbooks.Close();63 _application.Quit();64 }65 if (_range != null)66 {67 System.Runtime.InteropServices.Marshal.ReleaseComObject(_range);68 _range = null;69 }70 71 if (_worksheet != null)72 {73 System.Runtime.InteropServices.Marshal.ReleaseComObject(_worksheet);74 _worksheet = null;75 }76 if (_workbook != null)77 {78 System.Runtime.InteropServices.Marshal.ReleaseComObject(_workbook);79 _workbook = null;80 }81 if (_application != null)82 {83 System.Runtime.InteropServices.Marshal.ReleaseComObject(_application);84 _application = null;85 }86 GC.Collect();87 }88 }89 90 91 }

调用

1 using (ExcelHelper excelHelper = new ExcelHelper())2         {3             string filefullpath = excelHelper.CreateExcel();4         }

以上方法在本机测试通过,但是用Microsoft.Office.Interop.Excel遇到大并发操作可能会出现等待问题,经测试当用户A占着Excel进程生成Excel文件时,用户B也点击导出Excel,此时就会出现B等待的状态,直到A 释放Excel资源。

转载于:https://www.cnblogs.com/lc-chenlong/archive/2013/05/12/3074594.html

你可能感兴趣的文章
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
基于CMMI的敏捷开发过程文档裁剪
查看>>
0925 韩顺平java视频
查看>>
软件需求规格说明书
查看>>
53. Maximum Subarray
查看>>
iOS-程序启动原理和UIApplication
查看>>
SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器...
查看>>
git的安装
查看>>
mysql 8.0 zip包安装
查看>>
Spring框架系列(三)--Bean的作用域和生命周期
查看>>
springboot + mybatis
查看>>
awk 统计
查看>>
CSS min-height 属性
查看>>
SDN第一次作业
查看>>
模板设计模式的应用
查看>>
【井字游戏】做一款回忆童年的游戏
查看>>