Как избавиться при сбое приложения - PullRequest
2 голосов
/ 22 июня 2010

возникла проблема: я создаю одноэлементный вспомогательный объект, который оборачивает объекты PerformanceCounter.Он реализует IDisposable ... Но теперь я заметил, что когда я закрываю свое тестовое хост-приложение консоли, счетчики все еще видны в инструменте perfmon (в производственной среде я буду размещаться в службе Windows) и все еще будут работать.

Я понял, что Dispose вызывается внутри финализатора, но затем я не располагаю управляемыми ресурсами, которые являются объектами PerformanceCounter.Что я должен сделать, чтобы убедиться, что ресурсы должным образом освобождены?

Спасибо, Павел

Ответы [ 3 ]

2 голосов
/ 22 июня 2010

Если ваше приложение дает сбой, вы ничего не можете сделать, чтобы убедиться, что неуправляемые ресурсы удалены. Вам следует правильно реализовать одноразовый шаблон, используя неуправляемые ресурсы (если они еще не были), когда объект будет завершен. Таким образом, вы освободите свои ресурсы, когда служба будет закрыта, но в случае серьезного сбоя ваш код, вероятно, все равно не будет работать.

Я бы посоветовал, особенно если вы размещаете в службе Windows, которая может автоматически перезапускать ваш код, что вы пишете свой код с ожиданием его сбоя, оставляя неуправляемые ресурсы рядом, и, если возможно, повторно используете / восстанавливаете их , Кроме того, вы должны быть очень осторожны в программировании, чтобы убедиться, что любые сбои редки (и находятся вне вашего контроля).

1 голос
/ 22 июня 2010

Это нормальное поведение для счетчиков производительности. Это глобальные «объекты», которые существуют, даже если ни один процесс не генерирует для них данные. Например, вы можете выбрать один из счетчиков производительности .NET, даже если на компьютере не запущена ни одна программа .NET. Если счетчик активно генерирует данные, даже если у вас больше не запущен процесс, обновляющий его значение, возможно, вы выбрали неподходящий CounterType.

Просмотрите свойство InstanceLifetime, чтобы увидеть, подходит ли значение Process для вашего счетчика.

1 голос
/ 22 июня 2010

Проверьте код ниже, чтобы увидеть, если вы используете одноразовый шаблон. Финализатор должен явно вызывать ваш метод 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);
    }
}
...