C# WinForm 程序在关闭时,析构顺序,让本人很糊涂

.Net技术 码拜 7年前 (2017-04-28) 1748次浏览
class FlowProject
{
     // 内存映射文件对象(作为数据库使用)
     private mapFile;
}

如上,一个 FlowProject 类中,包含了一个内存映射文件对象,作为数据库使用。
FlowProject 被传递给了多个线程。
当用户,命令本人删除 FlowProject,并删除与其相关的工程文件 和 数据库文件时,
显然,本人不敢贸然将 FlowProject 进行 Dispose,原因是它还在被多线程使用。本人也不知道这些线程什么时候用完。
其中的数据库也一直打开着,不敢贸然关闭。不过,主线程,已经不再引用:

本人测试的时候,还未将 FlowProject 传给多线程。就是,界面删除该工程之后,关闭程序,来测试析构函数处理删除文件的逻辑。
假如,仅仅实在关闭程序时,析构顺序混乱,那还好了。
要是运行过程中析构顺序是乱的,那 C# 的引用和内存回收,岂不是不靠谱了。
本人要去释放某个本人引用的资源时,它却先析构(释放)了。 本人还持有它的引用呢,它怎么能析构呢?

你持有它的引用,然而你本身也没有对象引用,所以你们两个都在释放的队列中,而框架只是没有对你们再进行释放的顺序排序而已。想想假如还要对释放顺序进行排序,那这个效率损失,是不值得的

5

嗯,都基本上说到点上了
补充点,所谓的析构其实是一个不可靠的过程,特别是依赖GC机制,很可能不会被执行,甚至执行到一半就意外了,例如IIS暂停。因此应该尽量的减少在析构中去做一些关键性的维护,例如说更新数据。
应该考虑本人为什么需要用到析构,怎么样去做一个比较可靠的设计。
#4是大多数、也是“常规”的做法。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# WinForm 程序在关闭时,析构顺序,让本人很糊涂
喜欢 (0)
[1034331897@qq.com]
分享 (0)