代码之家  ›  专栏  ›  技术社区  ›  dragonfly

应用程序崩溃时如何处理

  •  2
  • dragonfly  · 技术社区  · 15 年前

    遇到一个问题:我创建了包装PerformanceCounter对象的singleton帮助器对象。它实现了IDisposable…但现在我发现,当我关闭测试示例控制台主机应用程序时,计数器在PerfMon工具中仍然可见(在生产中,我将在Windows服务中托管),并且仍在运行。

    我发现Dispose是在终结器内部调用的,但是我不释放托管资源——这是PerformanceCounter对象。我应该做些什么来确保适当地释放资源?

    谢谢,Pawel

    3 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

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

    请检查InstanceLifetime属性以查看进程值是否适合您的计数器。

        2
  •  2
  •   tvanfosson    15 年前

    如果您的应用程序崩溃,那么您没有太多的事情可以确保非托管资源被释放。您应该正确地实现可释放模式,当对象完成时,非托管资源将被释放(如果尚未释放)。通过这种方式,您将在服务关闭时释放资源,但在发生硬崩溃时,您的代码可能不会运行。

    我建议,尤其是如果您托管在Windows服务中,该服务可能会自动重新启动代码,那么您编写代码时希望代码可能崩溃,留下未管理的资源,并在可能的情况下重用/回收它们。除此之外,您在编程时还应该非常防御性,以确保很少发生崩溃(并且超出您的控制范围)。

        3
  •  1
  •   Steven    15 年前

    检查下面的代码,看看您是否在使用一次性模式。终结器应显式调用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);
        }
    }
    
    推荐文章