Jan*_*ray 28 c# asp.net-mvc garbage-collection entity-framework idisposable
我知道C#可以通过垃圾收集器很好地管理资源.但既然它有,那究竟是什么,为什么需要呢?
任何人都可以解释为什么.Dispose()在asp.net mvc中需要?
另外,处理连接意味着什么?为什么需要?任何人都知道为什么处理数据库连接很重要的复杂性db.Dispose()?这与EF相关,还是与SQL Server相关?我想知道为什么.
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
cHa*_*Hao 28
Dispose用于释放"非托管"资源(例如,套接字,文件句柄,位图句柄等),如果它在终结器外部调用(这是disposing标志所表示的,BTW),用于处理其他IDisposable对象,它不是更长的用处.
"非托管"资源不是由CLR管理的(因此名称),GC不会弄乱它们或将它们全部释放; 没有Dispose方法(和代码实际使用它!),它将依赖于对象的终结器进行清理.最终终结器将运行(如果应用程序运行正常,并且对象有终结器),并且如果终结器完成其工作,则所有半就行了......但是这样做会花费很多时间 - 如果你在此期间用尽了手柄,哦.对于其他线程/进程/任何需要它们的东西来说太糟糕了.
Dispose但是,如果您立即释放资源,那么事情就会好转.
(顺便说一下,这不仅限于EF,SQL Server或任何其他技术.在整个.net框架中都可以找到Disposable模式,只要你有一个不再存在的IDisposable,就可以利用它.用过的.)
至于为什么IDisposable到目前为止实现了树,而不是你只是逐个实现...我不是100%肯定.但想象一下你正在编写一个框架.考虑一下,如果一切都不是IDisposable,你必须检查 - 每次你想要摆脱一些东西!- 物体是否是一次性的,Dispose如果是的话.如果您改为实现IDisposable"以防万一",事情就会简化 - 您只需要处理.(如果一个对象没有任何要清理的东西,它只是不会覆盖Dispose- 在这种情况下,它的父Dispose进程被调用并进行任何清理,这可能没什么好处......)这是一个常见的控制器有足够的情况来清理,即使这不是真正的原因,无论如何都要做很多事情.
| 归档时间: |
|
| 查看次数: |
24113 次 |
| 最近记录: |