站点关闭时防止打开文件锁定

Posted

技术标签:

【中文标题】站点关闭时防止打开文件锁定【英文标题】:Preventing open file locks when site is shut down 【发布时间】:2018-02-21 03:47:46 【问题描述】:

一个文件被一个线程打开以进行写入。对文件的引用是方法中的局部变量,因此无法通过 dispose 或终结器进行清理。

代码使用using 语句确保在正常操作期间关闭文件并释放所有锁。但是,在站点被关闭的情况下,using 语句可能没有机会清理FileStream。但是,IIS 进程可能会保持打开状态,因此除非重新启动服务器,否则不会释放锁定。

如果站点停止或重新启动,防止文件锁定挂起的最佳方法是什么?

或者 IIS 关闭站点的方式是否缓解了这种担忧?

【问题讨论】:

这种情况多久发生一次?我的意思是你是在解决一个反复出现的问题,还是只是假设性地试图阻止它? 假设性地阻止它。虽然,我相信这实际上发生在我身上。 如果线程上的 finally 块不被允许运行并关闭文件句柄,线程是如何关闭的?如果线程被关闭,那么它的局部变量就不再是根了;为什么终结器不会运行?我不明白你的情况是怎么可能的。 据我所知,您无法避免(但我绝对不是 ASP.Net 专家,也不是 IIS 专家)。但是,您可以通过创建文件的内存副本、修改它并仅在进程的最后将修改“推送”到文件来减少锁定窗口。这样,文件仅被锁定两次(一次在复制期间,另一次在“推送”期间)。如果在这些小窗口期间发生关机,你就没有运气...... @EricLippert 如果线程被服务器停止,它会被服务器停止。它不在执行代码的控制范围内。 FileStream 的终结器最终会/可能会被调用...但这是不确定的,需要很长时间,尤其是在服务器没有内存压力的情况下。 【参考方案1】:

尽可能减少资源锁是一个很好的原则,你会看到不这样做的一个后果。我建议您仅在实际需要写入文件时打开并锁定文件,然后立即释放锁定并关闭文件。如果您担心重复打开文件(并寻求末尾追加)的性能开销,那么您应该分析代码以查看性能是否可以接受。

【讨论】:

有问题的代码已经最小化了文件流打开的时间。但是,由于该类是一个存储实用程序,它必然会有很多开放的FileStreams

以上是关于站点关闭时防止打开文件锁定的主要内容,如果未能解决你的问题,请参考以下文章

添加断点时 Javascript 文件被锁定

如何打开锁定的 mdb 文件?

未能锁定文件无法打开磁盘..*.vmdk或者某一个快照所依赖的磁盘。”解决办法

独占打开文件/锁定文件

锁定文件以防止多个用户访问它的最佳方法是啥

DW如何打开已经关闭的站点文件提示框