2013-08-12 2 views
2

В приложении C#, которое открывает как Windows Form, так и консоль, почему Finalizer вызывается всякий раз, когда функция закрыта, но не всякий раз, когда консоль закрыта? Можно ли вызвать Finalizer, даже если приложение закрывается с консоли?Finalizer не вызывается, когда консоль закрыта.

Я заметил это при создании класса, который создает файл в разделе «Конструкция» и удаляет файл в Dispose/Finalize. Он работал, как ожидалось, при закрытии формы, но файлы создавались, но не удалялись при закрытии консоли.

EDIT

я путать о терминах. Вот мой код для временного файла:

class TemporaryFile : IDisposable { 
    private String _FullPath; 

    public String FullPath { 
     get { 
      return _FullPath; 
     } 
     private set { 
      _FullPath = value; 
     } 
    } 

    public TemporaryFile() { 
     FullPath = NewTemporaryFilePath(); 
    } 

    ~TemporaryFile() { 
     Dispose(false); 
    } 

    private String NewTemporaryFilePath() { 
     const int TRY_TIMES = 5; // --- try 5 times to create a file 

     FileStream tempFile = null; 
     String tempPath = Path.GetTempPath(); 
     String tempName = Path.GetTempFileName(); 

     String fullFilePath = Path.Combine(tempPath, tempName); 
      try { 
       tempFile = System.IO.File.Create(fullFilePath); 
       break; 
      } 
      catch(Exception) { // --- might fail if file path is already in use. 
       return null; 
      } 
     } 

     String newTempFile = tempFile.Name; 
     tempFile.Close(); 

     return newTempFile;   
    } 

    public void Dispose() { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool calledFromDispose) { 
     DeleteFile(); 
    } 

    public void DeleteFile() { 
     try { 
      System.IO.File.Delete(FullPath); 
     } catch(Exception) { } //Best effort. 
    } 
} 
+1

Не используйте финализаторы в C#. Это архаичная концепция. Правильно используйте IDisposable –

+3

Без примеров кода/исключений это никогда не происходило ... –

+1

Как вы можете позвонить Dispose()? Вы делаете что-то неправильно. –

ответ

4

Проблема не в вашем коде как таковом.

Когда вы закрываете консольное приложение, нажимая на x в окне, Windows просто завершает процесс. Он не изящно закрывает его, поэтому никто из вашего кода очистки не вызван.

Можно подключиться к API-интерфейсу Console и поймать обработчик закрытия, а затем вручную удалить объекты, но есть сообщения, что эта функция не работает очень хорошо при более поздних версиях окон.

Capture console exit C#

+0

Я несколько подозревал это, m вероятно собирается скрыть Консоль. В этом случае есть ли способ поймать, пытается ли ОС завершить процесс? Я планирую поместить большой объем данных во временный файл, и было бы нежелательно, если бы эти данные никогда не стирались для пользователя, если он должен был досрочно или что-то прекратить. – souldzin

+0

@SoulDZIN: [this] (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit.aspx) должен помочь. – Vlad

+0

@ Vlad - Нет. Это событие не будет вызвано в случае, если приложение будет принудительно завершено. Это вызвано только во время изящного закрытия. –

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