2009-11-23 4 views
0

문서 (GH_Document)를 나타내는 클래스가 있습니다. GH_Document에는 잠재적으로 위험한 작업을 수행하기 전에 호출되는 AutoSave 메서드가 있습니다. 이 방법은 원본 파일 옆에 자동 저장 파일을 만들거나 덮어 씁니다.C# 자동 저장 정리; 모범 사례?

GH_Document에는 자동 저장 기능으로 만든 모든 파일을 디스크에서 제거하는 DestroyAutoSaveFiles()라는 메서드가 있습니다. 응용 프로그램이 닫히고 문서가 언로드 될 때 문서에서이 메서드를 호출합니다. 그러나 자동 종료 파일이 성공적으로 종료 된 후에도 몇 가지 사례가 누락 된 것으로 보입니다.

이렇게 나에게 생각이 들었다. 이런 상황을 처리하는 가장 좋은 방법은 무엇입니까? 문서가 사라질 수있는 모든 가능한 방법을 추적하고 어디에서나 자동 저장 정리 논리를 추가해야합니까? 또는 IDisposable 구현하고 GH_Document.Dispose() 정리를 수행해야합니까? 또는 GH_Document.Finalize()에서이 작업을 수행해야합니까?

자동 저장 파일을 디스크에 남기고 싶을 때만 응용 프로그램이 중단됩니다. Dispose 및 Finalize는 충돌 사고가 발생해도 호출되지 않도록 보장됩니까?

답변

1

충돌이 발생해도 Dispose 및 Finalize가 호출되지 않도록 보장됩니까?

일반적으로 응용 프로그램이 충돌하는 방식에 따라 다르지만 일반적으로 아니오입니다. C#에서는 일반적으로 최상위 수준까지 전파되는 예기치 않은 예외의 결과입니다. 이 경우 모든 finally 절은 스택 위로 올라가며 명령문을 사용하여 Dispose 호출을 포함합니다.

갑자기 응용 프로그램이 종료되면 (예 : 작업 관리자에서 응용 프로그램을 종료하여) finally 절이 호출되지 않지만이 동작에 의존해서는 안됩니다.

간단한 해결 방법은 특별한 명명 규칙을 사용하여 자동 저장 파일을 숨겨진 디렉토리에두고 성공적인 종료시 해당 디렉토리의 모든 자동 저장 파일을 삭제하는 것입니다.

+0

고마워, Finalize 방식을 거의 배제합니다. 내 응용 프로그램은 관리되지 않는 환경에서 관리되는 플러그인으로 실행되며 처리되지 않은 C++ 예외, 메모리 오버플로 또는 관리되는 예외로 인해 대부분의 충돌이 발생하여 기본 응용 프로그램이 다운됩니다. 사람이 내 앱의 인스턴스를 두 개 이상 실행할 수 있으며 한 인스턴스가 다른 인스턴스에서 자동 저장 파일을 삭제해서는 안되기 때문에 자동 저장 파일을 모두 삭제할 수 없습니다. 또한 사람들은이 '특별'폴더를 찾을 수 없으며 지원에 추가 부담을 둡니다. 나는 방금 방수 처리를해야 할 것 같아. –