【问题标题】:C# AutoSave cleanup; best practice?C# 自动保存清理;最佳实践?
【发布时间】:2010-12-19 11:25:48
【问题描述】:

我有一个代表文档的类 (GH_Document)。 GH_Document 上有一个 AutoSave 方法,该方法在每次潜在危险操作之前调用。此方法在原始文件旁边创建(或覆盖)一个 AutoSave 文件。

GH_Document 还包含一个名为 DestroyAutoSaveFiles() 的方法,该方法从磁盘中删除由 AutoSave 函数创建的所有文件。当应用程序关闭时,我在文档上调用此方法,以及当文档被卸载时。但是,我似乎错过了一些案例,因为在一些成功关闭后自动保存文件仍然存在。

所以这让我开始思考。处理这种情况的最佳方法是什么?我是否应该追踪文档消失的所有可能方式并在各处添加自动保存清理逻辑?或者我应该实现 IDisposable 并在 GH_Document.Dispose() 中执行清理?还是应该在 GH_Document.Finalize() 中执行此操作?

我希望自动保存文件保留在磁盘上的唯一情况是应用程序崩溃时。是否保证在发生崩溃时不会调用 Dispose 和 Finalize?

【问题讨论】:

    标签: c# dispose autosave finalize


    【解决方案1】:

    是否保证在发生崩溃时不会调用 Dispose 和 Finalize?

    一般来说,不会,尽管这取决于您的应用程序崩溃的方式。在 C# 中,它通常是传播到顶层的未捕获异常的结果。在这种情况下,任何 finally 子句都将在堆栈向上的过程中执行,其中包括来自 using 语句的 Dispose 调用。

    如果应用程序突然终止(例如通过在任务管理器中终止它),finally 子句将不会被调用,但您不应依赖此行为。

    一个简单的解决方案是将您的自动保存文件放在具有特殊命名约定的隐藏目录中,并在成功关闭时删除该目录中的所有自动保存文件。

    【讨论】:

    • 感谢 Mark,这几乎排除了 Finalize 方法。我的应用程序在非托管环境中作为托管插件运行,大多数崩溃是由于未处理的 C++ 异常、内存溢出或托管异常而发生的,这些异常又会导致基础应用程序崩溃。我无法销毁所有自动保存文件,因为人们可能正在运行我的应用程序的多个实例,并且一个实例不应从另一个实例中删除自动保存文件。此外,人们将无法找到这个“特殊”文件夹,这会给支持带来额外负担。我想我只需要使清理工作不漏水。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2021-01-14
    • 2011-06-25
    • 2010-10-18
    相关资源
    最近更新 更多