2

Windows フォームとコンソールの両方を開く C# アプリケーションで、From が閉じられるたびに Finalizer が呼び出されるのに、コンソールが閉じられるたびに呼び出されないのはなぜですか? アプリケーションがコンソールから閉じられている場合でも、Finalizer を呼び出す方法はありますか?

コンストラクションでファイルを作成し、Dispose / Finalizeでファイルを削除するクラスを作成しているときに、これに気付きました。フォームを閉じるときは期待どおりに機能しましたが、コンソールを閉じるときにファイルが作成されましたが、削除されませんでした。

編集

用語について混乱しているに違いありません。一時ファイルのコードは次のとおりです。

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.
    }
}
4

1 に答える 1