为什么在asp.net MVC控制器中需要一个显式的Dispose()方法?任何人都能解释其复杂性吗?(特定于asp.net)

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进程被调用并进行任何清理,这可能没什么好处......)这是一个常见的控制器有足够的情况来清理,即使这不是真正的原因,无论如何都要做很多事情.

  • ASP.NET MVC控制器发布了哪些非托管资源? (3认同)