class FlowProject { // 内存映射文件对象(作为数据库使用) private mapFile; }
如上,一个 FlowProject 类中,包含了一个内存映射文件对象,作为数据库使用。
FlowProject 被传递给了多个线程。
当用户,命令本人删除 FlowProject,并删除与其相关的工程文件 和 数据库文件时,
显然,本人不敢贸然将 FlowProject 进行 Dispose,原因是它还在被多线程使用。本人也不知道这些线程什么时候用完。
其中的数据库也一直打开着,不敢贸然关闭。不过,主线程,已经不再引用:
本人测试的时候,还未将 FlowProject 传给多线程。就是,界面删除该工程之后,关闭程序,来测试析构函数处理删除文件的逻辑。
假如,仅仅实在关闭程序时,析构顺序混乱,那还好了。
要是运行过程中析构顺序是乱的,那 C# 的引用和内存回收,岂不是不靠谱了。
本人要去释放某个本人引用的资源时,它却先析构(释放)了。 本人还持有它的引用呢,它怎么能析构呢?
你持有它的引用,然而你本身也没有对象引用,所以你们两个都在释放的队列中,而框架只是没有对你们再进行释放的顺序排序而已。想想假如还要对释放顺序进行排序,那这个效率损失,是不值得的
5
嗯,都基本上说到点上了
补充点,所谓的析构其实是一个不可靠的过程,特别是依赖GC机制,很可能不会被执行,甚至执行到一半就意外了,例如IIS暂停。因此应该尽量的减少在析构中去做一些关键性的维护,例如说更新数据。
应该考虑本人为什么需要用到析构,怎么样去做一个比较可靠的设计。
#4是大多数、也是“常规”的做法。
补充点,所谓的析构其实是一个不可靠的过程,特别是依赖GC机制,很可能不会被执行,甚至执行到一半就意外了,例如IIS暂停。因此应该尽量的减少在析构中去做一些关键性的维护,例如说更新数据。
应该考虑本人为什么需要用到析构,怎么样去做一个比较可靠的设计。
#4是大多数、也是“常规”的做法。