我在 Web 服务中实例化了类,该服务在静态成员中保留了一些资源。如果我不是静态地持有这些资源,我可能会通过一些 IDisposable 对象访问它们,我可以在 Dispose 上释放资源。无论保留此会话是否是一个好主意,.NET 是否提供了在静态解构类型时调用任何清理代码的方法?
请不要用“停止在静态成员变量中保存资源”之类的内容来回答此问题。我了解静态保留此信息的缺点,并且愿意接受后果(我们使用它来将我们所做的某些批处理的处理时间从 58 小时缩短到 4 小时)。具体问题是:鉴于这种情况,我是否可以很好地清理这些资源?
编辑:
我知道该类将在进程的其余部分中存在,但通过静态构造函数,.NET 使您有机会在将该类型加载到内存中时执行某些操作。你能在另一端做点什么吗?
实际上没有办法通过托管代码来做到这一点。您想要的是处理正在卸载的程序集,但在大多数情况下,当您希望它发生时,这不会发生。
更详细地说:
有一个 AppDomain.DomainUnload 事件(http://msdn.microsoft.com/en-us/library/system.appdomain.domainunload.aspx http://msdn.microsoft.com/en-us/library/system.appdomain.domainunload.aspx)你可以处理。当您的应用程序域从其托管进程(例如 ASP.NET)中卸载时,它将进行处理。
但是,如果您是 EXE,或者托管 EXE 正在回收,则不会引发此问题。如果设置正确,您也许能够处理本机 DLL_PROCESS_DETACH 并将其弹回托管代码,但由于加载程序锁定,您必须非常小心在该上下文中执行的操作(任何触发程序集加载的操作都会僵局)。
您可以阅读本文以了解需要进行哪些清理(提示:不多):http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx
基本上,您唯一需要担心的是将缓冲区刷新到磁盘,如果您需要做任何更复杂的事情,那么您已经搞砸了。 malloc() 和 new() 可能会立即使您的程序崩溃。这也适用于托管代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)