控制台关闭时不会调用终结器

时间:2013-08-12 16:50:38

标签: c#

在打开Windows窗体和控制台的C#应用​​程序中,为什么每当关闭From时调用Finalizer,而不是在控制台关闭时调用?即使从控制台关闭应用程序,有没有办法调用Finalizer?

在创建一个在Construction上创建文件的类并在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.
    }
}

1 个答案:

答案 0 :(得分:7)

问题不在于您的代码本身。

当您通过单击窗口中的x关闭控制台应用程序时,Windows只会终止该过程。它没有正常关闭它,因此没有任何清理代码被调用。

可以挂钩到Console API并捕获关闭处理程序然后手动处理您的对象,但有报告称此功能在更新版本的Windows下不能很好地工作。

Capture console exit C#