"资源托管"及"非托管资源"问题 --- 创建MDB文件时如何释放LDB为例
2008-07-06 12:41
302 查看
最近在用ASP.NET创建MDB文件,发现用ADOX.CATALOG创建MDB文件后,还会附带产生LDB临时日志文件;
附带LDB的MDB文件处于的是"打开"状态,难以执行 "删除"等操作.
从网上搜索问题及总结方法之后,发现还是得通过"在类上实现IDISPOSABLE接口"来实现临时托管
一.首先,介绍下"什么是托管资源和非托管资源":
(1)托管资源:是指由CLR管理分配和释放的资源,一般是托管内存,而非托管资源是由系统分配和释放的资源 ;一般地在CLR里new 一个对象或者分配一个数组都不需要手动去释放内存;new出来的对象占用的内存是托管资源
非托管资源:所有的Window内核对象(句柄)都是非托管资源,如文件句柄、套接字句柄、窗体句柄,字体、刷子、DC。。。
(2)补充:
应该说“托管”一词是和.net概念一起出生的,我们都知道以前的开发工具无论是Delphi、VB编译出的dll或exe文件都是二进制文件,可以被操作系统直接识别。而微软为了和JAVA火拼,实现跨平台的目的,就提出了.net概念,大道理不说了(书上都有),简单点说就是提出了一套中间语言(IL),然后让程序编译后生成中间语言文件,再通过自己的CLR去翻译、管理,那么我们就说CLR“托管”了,开句玩笑,它不管谁管啊。“非托管”就是CLR管不了的,楼上的都说了。
二.释放LDB文件的方法如下(创建一个类来实现):
'此类用于 产生 MDB 文件
Public Class DisposeExample
Public Class Create_MDB
Implements IDisposable(声明IDISPOSABLE接口之后,以下代码会自动生成)
Dim cat As ADOX.Catalog = New ADOX.Catalog
Private disposedValue As Boolean = False ' 检测冗余的调用
Public Sub Create_MDB_Function(ByVal path As String)
cat.Create(path)
End Sub
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: 显式调用时释放托管资源
' 释放 LDB 临时文件
cat = Nothing
System.GC.Collect()
End If
' TODO: 释放共享的非托管资源
End If
Me.disposedValue = True
End Sub
最后,只需要功能实现的地方调用这个类就可以了
附带LDB的MDB文件处于的是"打开"状态,难以执行 "删除"等操作.
从网上搜索问题及总结方法之后,发现还是得通过"在类上实现IDISPOSABLE接口"来实现临时托管
一.首先,介绍下"什么是托管资源和非托管资源":
(1)托管资源:是指由CLR管理分配和释放的资源,一般是托管内存,而非托管资源是由系统分配和释放的资源 ;一般地在CLR里new 一个对象或者分配一个数组都不需要手动去释放内存;new出来的对象占用的内存是托管资源
非托管资源:所有的Window内核对象(句柄)都是非托管资源,如文件句柄、套接字句柄、窗体句柄,字体、刷子、DC。。。
(2)补充:
应该说“托管”一词是和.net概念一起出生的,我们都知道以前的开发工具无论是Delphi、VB编译出的dll或exe文件都是二进制文件,可以被操作系统直接识别。而微软为了和JAVA火拼,实现跨平台的目的,就提出了.net概念,大道理不说了(书上都有),简单点说就是提出了一套中间语言(IL),然后让程序编译后生成中间语言文件,再通过自己的CLR去翻译、管理,那么我们就说CLR“托管”了,开句玩笑,它不管谁管啊。“非托管”就是CLR管不了的,楼上的都说了。
二.释放LDB文件的方法如下(创建一个类来实现):
'此类用于 产生 MDB 文件
Public Class DisposeExample
Public Class Create_MDB
Implements IDisposable(声明IDISPOSABLE接口之后,以下代码会自动生成)
Dim cat As ADOX.Catalog = New ADOX.Catalog
Private disposedValue As Boolean = False ' 检测冗余的调用
Public Sub Create_MDB_Function(ByVal path As String)
cat.Create(path)
End Sub
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: 显式调用时释放托管资源
' 释放 LDB 临时文件
cat = Nothing
System.GC.Collect()
End If
' TODO: 释放共享的非托管资源
End If
Me.disposedValue = True
End Sub
最后,只需要功能实现的地方调用这个类就可以了
相关文章推荐
- c#中的托管资源和非托管资源的释放问题
- 浅谈C#托管程序中的资源释放问题(摘自网络)
- .NET.GC 浅谈.net托管程序中的资源释放问题 (转帖)
- 浅谈C#托管程序中的资源释放问题
- 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)—托管资源优化—垃圾回收机制深度剖析
- 如何创建ue4的资源文件
- vs2013使用qt设计师创建新窗体后如何关联资源文件
- 如何:为 ASP.NET 网站创建资源文件 (Visual Studio)
- [转].NET.GC 浅谈.net托管程序中的资源释放问题
- 刚注册,问个问题,在asp.net里有个xml文档以MemoryStream存在资源文件中,现在我如何把他读出来,还原成xml文档。
- Android中如何给layout资源文件分类 在layout下创建子文件夹
- 同一线程多次创建 的 线程资源释放问题在每个线程的一开始,用pthred_detach(pthread_self())来使自己detach掉
- 构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)―托管资源优化―监测CLR性能
- ADO.NET Entity Framework 如何:创建模型及映射文件嵌入资源(实体框架)
- VC如何将资源中包含的位图释放成文件
- 浅谈C#托管程序中的资源释放问题 好文章!!!
- 浅谈C#托管程序中的资源释放问题
- 多个资源文件释放的问题
- 如何创建 CAB 文件和如何从文件、内存和资源中解压缩 CAB 文件