应用程序崩溃时如何处理

时间:2010-06-22 11:39:35

标签: .net dispose idisposable

遇到了问题:我创建了包装PerformanceCounter对象的单件辅助对象。它实现了IDisposable ...但是现在我发现当我关闭我的测试样本控制台宿主应用程序时,计数器仍然在perfmon工具中可见(在生产中我将托管在Windows服务中),并且仍然在运行。

我发现在终结器中调用了Dispose,但后来我没有处理托管资源 - 这是PerformanceCounter对象。我该怎么做才能确保资源得到适当的释放?

谢谢,Pawel

3 个答案:

答案 0 :(得分:2)

如果您的应用程序崩溃,则无法确保卸载非托管资源。您应该正确实现一次性模式,在最终确定对象时处理非托管资源(如果尚未处理)。通过这种方式,您将在服务关闭时释放资源,但如果发生硬故障,您的代码可能无法运行。

我建议,特别是如果您在可能会自动重启代码的Windows服务中托管,您编写代码时可能会崩溃,留下非托管资源并尽可能重用/回收它们。除此之外,你还应该在编程时非常防守,以确保任何崩溃都是罕见的(并且超出你的控制范围)。

答案 1 :(得分:1)

检查下面的代码,看看你是否使用了一次性图案。终结器应该明确地调用您的dispose方法。

class DisposableObject : IDisposable
{
    public void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected void Dispose(bool disposing)
    {
        if (disposing)
        {
            // dispose managed resources
        }
        // dispose unmanaged resources
    }

    ~DisposableObject()
    {
        this.Dispose(false);
    }
}

答案 2 :(得分:1)

这是性能计数器的正常行为。即使没有进程为它们生成数据,它们也是存在的全局“对象”。例如,即使计算机上没有运行单个.NET程序,也可以选择其中一个.NET perf计数器。如果计数器正在主动生成数据,即使您没有正在运行的进程更新其值,那么您可能选择了不合适的CounterType。

查看InstanceLifetime属性以查看Process值是否适合您的计数器。