2009-11-23 3 views
0

У меня есть класс, представляющий документ (GH_Document). GH_Document имеет на нем метод AutoSave, который вызывается перед каждой потенциально опасной операцией. Этот метод создает (или перезаписывает) файл AutoSave рядом с исходным файлом.C# AutoSave cleanup; лучшая практика?

GH_Document также содержит метод DestroyAutoSaveFiles(), который удаляет все и все файлы с диска, созданные функцией AutoSave. Я вызываю этот метод на документы, когда приложение закрывается, а также когда документы разгружаются. Однако, похоже, я пропустил несколько случаев, поскольку файлы AutoSave все еще присутствуют после некоторых успешных остановок.

Так что это заставило меня задуматься. Каков наилучший способ справиться с такими ситуациями? Должен ли я отслеживать все возможные способы, с помощью которых документы могут исчезнуть и добавить логику автоматической очистки во всем мире? Или я должен реализовать IDisposable и выполнить очистку в GH_Document.Dispose()? Или я должен делать это в GH_Document.Finalize()?

Единственный раз, когда я хочу, чтобы файл автосохранения оставался на диске, это если приложение сработает. Гарантируется ли «Утилизация и Финализация» не вызывать в случае аварии?

ответ

1

Are Dispose and Finalize гарантированно не будет вызван в случае аварии?

В общем, нет, хотя это зависит от того, как сбой приложения. В C# это, как правило, является результатом неперехваченного исключения, распространяющегося вплоть до верхнего уровня. В этом случае любые окончательные предложения будут выполняться по пути вверх по стеку и включают в себя Dispose вызовы от использования операторов.

Если приложение неожиданно прекращено (например, убив его в диспетчере задач), предложения finally не будут вызываться, но вы не должны полагаться на это поведение.

Простым решением является автоматическое сохранение файлов в скрытом каталоге со специальным соглашением об именах и удаление всех файлов автосохранения в этом каталоге при успешном завершении работы.

+0

Благодарю Марка, что в значительной степени исключает подход Finalize. Мое приложение работает как управляемый плагин в неуправляемой среде, и большинство сбоев происходит из-за необработанных исключений C++, переполнения памяти или управляемых исключений, которые, в свою очередь, приводят к сбою базового приложения. Я не могу уничтожить ВСЕ файлы автосохранения, так как у людей может быть несколько экземпляров моего приложения, и один экземпляр не должен удалять файлы автосохранения из другого. Кроме того, люди не смогут найти эту «специальную» папку, это добавит дополнительную нагрузку на поддержку. Думаю, мне просто нужно сделать очистку водонепроницаемой. –

Смежные вопросы