В приложении 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.
}
}
Не используйте финализаторы в C#. Это архаичная концепция. Правильно используйте IDisposable –
Без примеров кода/исключений это никогда не происходило ... –
Как вы можете позвонить Dispose()? Вы делаете что-то неправильно. –