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

C# 控制台关闭时不调用终结器,c#,C#,在一个同时打开Windows窗体和控制台的C#应用程序中,为什么在关闭From时调用终结器,而不是在关闭控制台时调用终结器?即使从控制台关闭应用程序,是否也可以调用终结器 我在创建一个类时注意到了这一点,该类在构造时创建一个文件,在Dispose/Finalize时删除该文件。它在关闭窗体时按预期工作,但在关闭控制台时正在创建文件,但未删除文件 编辑 我一定对这些条款感到困惑。以下是我的临时文件代码: class TemporaryFile : IDisposable { private

在一个同时打开Windows窗体和控制台的C#应用程序中,为什么在关闭From时调用终结器,而不是在关闭控制台时调用终结器?即使从控制台关闭应用程序,是否也可以调用终结器

我在创建一个类时注意到了这一点,该类在构造时创建一个文件,在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.
    }
}

问题不在代码本身

当您通过单击窗口中的x来关闭控制台应用程序时,Windows只会终止该过程。它不会优雅地关闭它,因此不会调用任何清理代码

可以挂接到控制台API并捕获close处理程序,然后手动处理对象,但有报告称,在较新版本的windows下,此功能不能很好地工作


不要在C#中使用终结器。这是一个古老的概念。使用IDisposable properlyWhithout示例代码/异常详细信息这从未发生过…如何安排调用Dispose()?你做错了什么。类似乎没问题,我敢打赌你没有在应用程序中使用
using
,也没有调用
Dispose
。您不能依赖终结器,它们完全有权不运行(特别是在短时间运行的控制台应用程序中)。您必须使用
处置
(直接或通过
使用
)。@SoulDZIN-您可以尝试禁用关闭按钮,以防止自己意外关闭它。我有点怀疑这一点,所以我可能要隐藏控制台。在这种情况下,如果操作系统试图终止进程,是否有办法捕获?我计划将大量数据放入临时文件中,如果用户不得不提前结束进程或其他事情,而这些数据从未被删除,这将是不可取的。@SoulDZIN:必须帮助。@Vlad-否。如果应用程序被强制终止,也不会调用该事件。只有在正常关机时才会调用它。@Mystere-Man:如果应用程序是通过任务管理器关闭的,就没有办法截获它,对吗?所以我们可以忽略它。我认为OP的意思是“关闭窗口”,意思是“试图终止进程”。然而,如果操作系统强制终止进程,当然没有合法的方法。@Vlad-他的意思是单击windows控制台窗口中的“关闭”框,它(理论上)会向应用程序发送一些Win32信号,如果忽略它,则与在任务管理器中杀死它一样。然而,Windows7+在正确捕捉这些信号方面显然存在问题。这可能与他们安装的防破碎装置有关。